[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];
質問: 誰かが理由を理解するのを手伝ってくれますか?
2 番目のケースでは、 を初期化して設定した後、ループ パラメーターで$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);