有時候,我真想寫:使用「undef」初始化自編碼代碼?
my $var = shift // undef; # argument is optional
# or
my $var = $val{optional_value} // undef;
,以表明它是確定有說法缺少,否則// undef
是沒用的,當然。
這是多麼昂貴,它由編譯器優化了嗎?
有時候,我真想寫:使用「undef」初始化自編碼代碼?
my $var = shift // undef; # argument is optional
# or
my $var = $val{optional_value} // undef;
,以表明它是確定有說法缺少,否則// undef
是沒用的,當然。
這是多麼昂貴,它由編譯器優化了嗎?
要回答你的問題:不是。
我敢肯定,它不是很貴,但我不得不說,
my $var = shift // undef;
是幾乎沒有
my $var = shift; # argument is optional
或
my $var = shift; # optional; undef if omitted
這兩者都是一樣清晰在運行時絕對(儘管很少)便宜。如果您需要評論(爲了清晰起見),那麼除了不必要的操作碼之外,// undef
還會添加什麼內容?
我嘗試了標杆:
use strict;
use Benchmark qw(:all);
sub shu
{
my $x = shift // undef;
return $x // 0;
}
sub sh
{
my $x = shift;
return $x // 0;
}
timethese (100_000_000, { shu => \&shu, sh => \&sh });
# outputs:
# Benchmark: timing 100000000 iterations of sh, shu...
# sh: 14 wallclock secs (14.95 usr + -0.06 sys = 14.89 CPU) @ 6715916.72/s (n=100000000)
# shu: 16 wallclock secs (16.74 usr + -0.02 sys = 16.72 CPU) @ 5980861.24/s (n=100000000)
所以結果證實了上面說。
你可能想要找出一個基準。 – Jokester 2012-07-26 02:45:28
如果我在生產代碼中看到這種情況,我很可能會認爲這是一個錯誤。堅持評論,如果你覺得他們需要 – Borodin 2012-07-26 08:27:53