2012-07-26 26 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) 

所以结果证实了上面说。