通过Devel::NYTProf运行我的脚本表明,以下代码部分占用了绝大部分运行时间。该函数创建了一个更容易使用的散列,并将该散列推入数组。我在想怎么能不花那么长时间就完成这件事。
来自Devel::NYTProf:
# Statements | Time on line | Calls | Time in sub
21092 16.4s 21092 273s push( @events, { create_events_hash($1, $2, $j, @eventHash) } );
# spent 273s making 21092 calls to Parser::create_events_hash, avg 12.9ms/call
# ...
# spent 273s (268+4.95) within Parser::create_events_hash which was called 21092 times,
avg 12.9ms/call: # 21092 times (268s+4.95s) by
Parser::findNewMessages at line 86, avg 12.9ms/call
# Statements | Time on line
sub create_events_hash {
21092 159s my ( $dateIndex, $msgIDIndex, $eventHashIndex, @eventHash ) = @_;
21092 81.8ms my %holder;
21092 137ms $holder{ID} = $eventHashIndex;
21092 190ms $holder{msgDate} = $dateIndex;
21092 243ms $holder{ReceivedAt} = $eventHash[$eventHashIndex]{ReceivedAt};
21092 181ms $holder{msgID} = $msgIDIndex;
21092 193ms $holder{FromHost} = $eventHash[$eventHashIndex]{FromHost};
21092 187ms $holder{Priority} = $eventHash[$eventHashIndex]{Priority};
21092 97.6s return %holder;
}
2条答案
按热度按时间2o7dmzc51#
对于初学者,我会发送@eventhash作为参考。
这是更有效的方式,因为它不会使数组的副本。
yv5phkfx2#
可能你真的不能从一堆赋值语句中挤出很多时间。
你可能需要检查你的算法,为什么你要调用21 k次?
你已经有了一个哈希数组。也许你正在以一种非常低效的方式进行迭代。
另外,你传递给函数的是一个散列,而不是一个散列引用。所以试着传入一个引用,就像@Hameed建议的那样,也试着传出一个引用,看看会发生什么。
将引用传递出去可能对代码的影响最小,然后您可以看到传递引用与对象对运行时的影响。但我同意Hameed的观点--你传入的大数组复制到堆栈上的时间比你返回的小散列要长。