2012-07-26 28 views
3

有時候,我真想寫:使用「undef」初始化自編碼代碼?

my $var = shift // undef; # argument is optional 
          # or 

my $var = $val{optional_value} // undef; 

,以表明它是確定有說法缺少,否則// undef是沒用的,當然。

這是多麼昂貴,它由編譯器優化了嗎?

+2

你可能想要找出一個基準。 – Jokester 2012-07-26 02:45:28

+1

如果我在生產代碼中看到這種情況,我很可能會認爲這是一個錯誤。堅持評論,如果你覺得他們需要 – Borodin 2012-07-26 08:27:53

回答

1

要回答你的問題:不是。

7

我敢肯定,它不是很貴,但我不得不說,

my $var = shift // undef; 

是幾乎沒有

my $var = shift; # argument is optional 

my $var = shift; # optional; undef if omitted 

這兩者都是一樣清晰在運行時絕對(儘管很少)便宜。如果您需要評論(爲了清晰起見),那麼除了不必要的操作碼之外,// undef還會添加什麼內容?

+0

我只在這裏添加了評論,在這個例子中。 – Sadko 2012-07-26 03:36:37

+0

@Sadko,我很懷疑,這就是爲什麼我的例子沒有評論。 '// undef'對你來說可能很清楚,但我懷疑這是否會讓其他人閱讀你的代碼。另一方面,評論應該清楚給任何人。 – cjm 2012-07-26 03:38:54

+0

是的。我正在考慮爲自己提醒。對於其他讀者,評論更清楚。 – Sadko 2012-07-26 03:44:13

0

我嘗試了標杆:

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) 

所以結果證實了上面說。