通过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;
}
答案 0 :(得分:6)
对于初学者,我会发送@eventhash作为参考。
push(@events, {create_events_hash($1, $2, $j, \@eventHash)});
这种方式更有效,因为它不会复制数组。
答案 1 :(得分:1)
可能你不能真正从一堆任务语句中挤出很多时间。
您可能需要检查您的算法,为什么要调用21k次?
你已经有了一系列哈希。也许你正以一种非常低效的方式进行迭代。
另外,您将散列传递给函数,而不是散列引用。所以尝试传递一个引用,就像@Hameed建议的那样,并尝试传递一个引用,看看它是做什么的。
传递引用可能对代码的影响最小,然后您可以看到传递refs vs对象对运行时有什么样的影响。但是我会同意Hameed - 你传入的大数组将需要更多的时间复制到堆栈然后返回的小哈希。