[草莓的Perl v5.16.3,視窗7 64,通過執行CMD,例如C:\草莓> 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
,以及@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);
不能確定地複製。你能發佈完整的基準代碼和狀態Perl版本/操作系統嗎? – amon
感謝您的反饋。發佈編輯以包含一些信息。仍然試圖包括重要的代碼,但不讓我的帖子很可怕... –
您的代碼似乎在1E-5秒(10微秒)的範圍內產生時間。這遠遠小到可以提供可用的結果。此外,你的代碼並不清楚你的時間。當以足夠的迭代運行[benchmark](https://metacpan.org/module/Benchmark)時,沒有真正的差異可見。 – amon