为什么子例程参数比外部变量使用更慢?

时间:2010-11-25 09:48:56

标签: perl benchmarking subroutine execution-time

运行以下代码:

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版本慢得多?

3 个答案:

答案 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() },