[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
在循环参数中使用。如果是这种情况,我可能会确信$ARGV[0]
在 forloop 中反复测试比我自己定义的变量要慢......但事实并非如此。
为了跟踪时间,我use Time::HiRes; my $time = [Time::HiRes::gettimeofday()];
在脚本的顶部使用:,print "\n1: ", Time::HiRes::tv_interval($time);
在底部使用:。
使困惑!
谢谢,
迈克尔
编辑
我包含了整个脚本,在违规行之前有一个注释......有趣的是,看起来时间差异至少部分取决于我的冗余初始化%h
,以及@chain
......这变得很奇怪。
use Time::HiRes; my $time = [Time::HiRes::gettimeofday()];
#my $max=$ARGV[0];
my %h = (1=>1,89=>89);
$h{1}=1;
$h{89}=89;
my @chain=();
my $ans=0;
sub sum{my $o=0; foreach (@_){$o+=$_}; return $o;}
foreach (1..$ARGV[0]-1){
my $x=$_;
my @chain = ();
while(!exists($h{$x})){
push(@chain,$x);
$x = sum(map {$_**2} split('',$x));
}
foreach (@chain){$h{$_}=$h{$x} if !exists($h{$_});}
}
print "\n1: ", Time::HiRes::tv_interval($time);
foreach (1..$ARGV[0]){$ans++ if ($h{$_}==89);}
print "\n2: ", Time::HiRes::tv_interval($time);