[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
答案 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";