1

通过 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;
                    }   
4

2 回答 2

6

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

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

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

于 2012-07-06T14:50:21.227 回答
1

可能是您无法真正从一堆赋值语句中挤出太多时间。

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

您已经有一个哈希数组。也许您正在以一种非常低效的方式进行迭代。

另外,您将散列传递给函数,而不是散列引用。因此,请尝试按照@Hameed 的建议传入引用,并尝试将引用也传出,看看会发生什么。

将引用传递出去可能对你的代码影响最小,然后你就可以看到传递 refs vs objects 对运行时有什么样的影响。但我同意 Hameed 的观点 - 您传入的大数组将花费更多时间复制到堆栈上,然后是您返回的小散列。

于 2012-07-06T15:32:42.780 回答