创建一个哈希数组显示性能缓慢,如何改进?

时间:2012-07-06 14:42:39

标签: performance perl

通过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 个答案:

答案 0 :(得分:6)

对于初学者,我会发送@eventhash作为参考。

push(@events, {create_events_hash($1, $2, $j, \@eventHash)});

这种方式更有效,因为它不会复制数组。

答案 1 :(得分:1)

可能你不能真正从一堆任务语句中挤出很多时间。

您可能需要检查您的算法,为什么要调用21k次?

你已经有了一系列哈希。也许你正以一种非常低效的方式进行迭代。

另外,您将散列传递给函数,而不是散列引用。所以尝试传递一个引用,就像@Hameed建议的那样,并尝试传递一个引用,看看它是做什么的。

传递引用可能对代码的影响最小,然后您可以看到传递refs vs对象对运行时有什么样的影响。但是我会同意Hameed - 你传入的大数组将需要更多的时间复制到堆栈然后返回的小哈希。