有时我想写:
my $var = shift // undef; # argument is optional
# or
my $var = $val{optional_value} // undef;
表示可以缺少参数,否则// undef
当然没用。
这有多贵,是否被编译器优化了?
答案 0 :(得分:7)
我确定它不是很贵,但我不得不说
my $var = shift // undef;
不像
那么明确my $var = shift; # argument is optional
或
my $var = shift; # optional; undef if omitted
这两者在运行时肯定(虽然几乎没有)更便宜。如果你还是需要评论(为了清楚起见),那么// undef
除了不必要的操作码之外真正添加了什么?
答案 1 :(得分:1)
回答你的问题:不,不。
答案 2 :(得分: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)
结果证实了上述内容。