【问题标题】:why are sub routine arguments slower to use than outer variables?为什么子例程参数的使用比外部变量慢?
【发布时间】:2010-11-25 09:48:55
【问题描述】:

运行以下代码:

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 慢很多?

【问题讨论】:

  • 不同的主题,但不要忘记你可以这样做:join '', @$arrayref

标签: perl benchmarking subroutine execution-time


【解决方案1】:

这要慢得多,因为每次调用它时都会创建一个新的匿名数组 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%                 --

【讨论】:

  • 该死的。你快了 11 秒。 ;)
【解决方案2】:

我会说,因为 DEFAULT 每次调用都使用一个相同的数组,而 NODEFAULT 必须为每次调用的数组分配和释放空间。与以下内容进行比较:

Benchmark::cmpthese(
  -10,
  {
    VARIABLE_DEFAULT => sub { VARIABLE() },
    VARIABLE_NODEFAULT => sub { VARIABLE($defaultArray) },
  }
);
评价 VARIABLE_NODEFAULT VARIABLE_DEFAULT VARIABLE_NODEFAULT 1619427/s -- -4% VARIABLE_DEFAULT 1689428/s 4% --

【讨论】:

  • 是的 :) 我正在结束这个问题,但你们都应该得到一个 +
  • @OMG_peanuts:“问题已被回答”不被认为是在这里关闭问题的正当理由,所以不要指望得到其他 4 票需要关闭那会发生。相反,您应该通过单击旁边的绿色复选标记“接受”其中一个答案。
【解决方案3】:

知道了。这不是使用参数而不是外部变量,而是测试自己:VARIABLE_NODEFAULT => sub { VARIABLE([4,3,2,1]) } 在这一行中,我们创建了一个数组。不在这个:VARIABLE_DEFAULT => sub { VARIABLE() },.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多