perl subs 的参数在@_ 中传递。为了使我的程序更易于阅读,我一直使用这种模式来获取命名参数:
sub foo1 {
my ($bar, $baz) = @_;
do_something($bar,$baz);
}
但它会导致$_[0]
并被复制。如果我要直接访问而不是在上述模式中访问,我可以使用按引用调用的常见警告对调用者参数进行按值调用/别名访问,但它要快得多(参见下面的演示)。$_[1]
$_[0]
$bar
我怀疑这种my ($param1, $param2 ...) = @_;
模式出于性能原因是不好的。所以我发现我必须在快速和可读的程序之间做出选择,这是一个不可能的选择。
我最终编写了以性能为重点的潜艇,$_[<n>]
而其他一切都与上述模式一致。麻烦的是,我通常事先不知道瓶颈在哪里;-)
有没有办法获得也很快的命名参数?或者这件事似乎是经典?$_[0]
还是$bar
?
附录:速度演示
use Time::HiRes qw(time);
# Lets just do *something* with the parameters - here we just add up all
# their lengths
my $totalLength = 0;
sub foo1 {
# Access $_[0] directly - effectively call-by-reference
$totalLength += length($_[0]);
}
sub foo2 {
# Access a copy of $_[0] - effectively call-by-value - involves
# copying
my ($bar) = @_;
$totalLength += length($bar);
}
my $a = 'b' x 10_000;
my $t0 = time;
foreach (0..1_000_000) {
foo1($a);
}
printf "foo1 %2.6f\n", time - $t0;
$t0 = time;
foreach (0..1_000_000) {
foo2($a);
}
printf "foo2 %2.6f\n", time - $t0;
打印出来
foo1 0.329470
foo2 1.280364
foo1 几乎比 foo2 快 4 倍,因为它避免了复制$_[0]
。