3

有时我想写:

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

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

表明可以缺少参数,否则// undef当然是无用的。

这有多贵,编译器是否对其进行了优化?

4

3 回答 3

7

我敢肯定它不是很贵,但我不得不说

my $var = shift // undef;

并不像

my $var = shift;    # argument is optional

或者

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

这两者在运行时肯定(尽管几乎没有)便宜。如果您仍然需要注释(为了清楚起见),那么// undef除了不必要的操作码之外,真正添加了什么?

于 2012-07-26T03:31:20.830 回答
1

回答你的问题:不是和不是。

于 2012-07-26T03:08:32.973 回答
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)

所以结果证实了上面所说的。

于 2012-07-26T03:39:47.677 回答