运行以下代码:
use strict;
use warnings;
use Benchmark;
my $defaultArray = [1,2,3,4];
sub VARIABLE {
my $arrayref = @_ ? $_[0] : $defaultArray;
return $arrayref->[0].$arrayref->[1].$arrayref->[2].$arrayref->[3];
}
Benchmark::cmpthese(
-10,
{
VARIABLE_DEFAULT => sub { VARIABLE() },
VARIABLE_NODEFAULT => sub { VARIABLE([4,3,2,1]) },
}
);
我得到以下基准测试结果:
Rate VARIABLE_NODEFAULT VARIABLE_DEFAULT
VARIABLE_NODEFAULT 313631/s -- -74%
VARIABLE_DEFAULT 1210501/s 286% --
为什么NODEFAULT版本比DEFAULT版本慢得多?
答案 0 :(得分:4)
速度要慢得多,因为每次调用它时都会创建一个新的匿名数组ref。将代码更改为:
use strict;
use warnings;
use Benchmark;
my $defaultArray = [1,2,3,4];
sub VARIABLE {
my $arrayref = @_ ? $_[0] : $defaultArray;
return $arrayref->[0].$arrayref->[1].$arrayref->[2].$arrayref->[3];
}
Benchmark::cmpthese(
-10,
{
VARIABLE_DEFAULT => sub { VARIABLE() },
VARIABLE_NODEFAULT => sub { VARIABLE($defaultArray) },
}
);
你的基准测试结果更好:
Rate VARIABLE_NODEFAULT VARIABLE_DEFAULT
VARIABLE_NODEFAULT 1065824/s -- -2%
VARIABLE_DEFAULT 1085082/s 2% --
答案 1 :(得分:4)
我会说因为DEFAULT为每个调用使用一个相同的数组,而NODEFAULT必须为每个调用分配和释放数组的空间。与以下内容比较:
Benchmark::cmpthese(
-10,
{
VARIABLE_DEFAULT => sub { VARIABLE() },
VARIABLE_NODEFAULT => sub { VARIABLE($defaultArray) },
}
);
Rate VARIABLE_NODEFAULT VARIABLE_DEFAULT VARIABLE_NODEFAULT 1619427/s -- -4% VARIABLE_DEFAULT 1689428/s 4% --
答案 2 :(得分:1)
知道了。这不是使用参数而不是外部变量,而是测试自己:VARIABLE_NODEFAULT => sub { VARIABLE([4,3,2,1]) }
在这一行中,我们创建了一个数组。不在这一个:VARIABLE_DEFAULT => sub { VARIABLE() },
。