perl 创建一个哈希数组显示出缓慢的性能,如何改善?

bqucvtff  于 2023-06-06  发布在  Perl
关注(0)|答案(2)|浏览(235)

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

2o7dmzc51#

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

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

这是更有效的方式,因为它不会使数组的副本。

yv5phkfx

yv5phkfx2#

可能你真的不能从一堆赋值语句中挤出很多时间。
你可能需要检查你的算法,为什么你要调用21 k次?
你已经有了一个哈希数组。也许你正在以一种非常低效的方式进行迭代。
另外,你传递给函数的是一个散列,而不是一个散列引用。所以试着传入一个引用,就像@Hameed建议的那样,也试着传出一个引用,看看会发生什么。
将引用传递出去可能对代码的影响最小,然后您可以看到传递引用与对象对运行时的影响。但我同意Hameed的观点--你传入的大数组复制到堆栈上的时间比你返回的小散列要长。

相关问题