Perl,cmd,$ ARGV [0],慢

时间:2013-08-01 21:22:03

标签: performance perl cmd argv

[Strawberry Perl v5.16.3,Windows 7 x64,通过cmd执行,例如c:\ strawberry> perl test.pl 100000]

症状:以下代码:foreach (1..$ARGV[0]) { foo($_); }执行速度比我之前包含此额外行的速度慢约20%:my $num = $ARGV[0];

问题:任何人都可以帮我理解原因吗?

注意,在第二种情况下,在初始化并设置$num之后,我不在循环参数中使用$num。如果是这样的话,我可能会相信在forloop中反复测试$ARGV[0]比我自己定义的变量慢......但事实并非如此。

为了跟踪时间,我在脚本顶部使用:use Time::HiRes; my $time = [Time::HiRes::gettimeofday()];,在底部使用:print "\n1: ", Time::HiRes::tv_interval($time);

困惑!

谢谢,

迈克尔

修改

我正在包含整个脚本,并在违规行之前发表评论......有趣的是,时间差异似乎至少部分取决于%h的冗余初始化以及{{1这很奇怪。

@chain

1 个答案:

答案 0 :(得分:2)

在我的系统上(GNU / Linux上的perl 5.16.3),没有可衡量的差异。时间的标准偏差大于不同版本的测量值之间的差异。

对于脚本的每个变体,执行了10次执行。在所有情况下$ARGV[0]都是3.5E5(350000)。

没有my $num = $ARGV[0]

$ perl measure.pl 
2.369921 2.38991 2.380969 4.419895 2.398861 2.420928 2.388721 2.368144 2.387212 2.386347
mean:  2.5910908
sigma: 0.609763793801797

使用my $num = $ARGV[0]

$ perl measure.pl 
4.435764 2.419485 2.403696 2.401771 2.411345 2.466776 4.408127 2.416889 2.389191 2.397409
mean:  2.8150453
sigma: 0.803721101668365

measure.pl脚本:

use strict; use warnings; use 5.016;
use List::Util 'sum';

my @times = map qx/perl your-algorithm.pl 3.5E5/, 1..10;
chomp @times;

say "@times";
say "mean:  ", mean(@times);
say "sigma: ", sigma(@times);


sub mean { sum(@_)/@_ }

sub sigma {
    my $mean = mean(@_);
    my $variance = sum(map { ($_-$mean)**2 } @_) / @_;
    sqrt $variance;
}

减少your-algorithm.pl以便只打印一个时间:

foreach (1..$ARGV[0]){$ans++ if ($h{$_}==89);}
print Time::HiRes::tv_interval($time), "\n";