Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么子程序参数使用起来比外部变量慢?_Perl_Benchmarking_Subroutine_Execution Time - Fatal编程技术网

Perl 为什么子程序参数使用起来比外部变量慢?

Perl 为什么子程序参数使用起来比外部变量慢?,perl,benchmarking,subroutine,execution-time,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( -

运行以下代码:

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

明白了。这不是使用参数而不是外部变量,而是测试本身:
variable_NODEFAULT=>sub{variable([4,3,2,1])}

在这一行中,我们创建一个数组。不在这一个:
VARIABLE\u DEFAULT=>sub{VARIABLE()},

明白了。这不是使用参数而不是外部变量,而是测试本身:
variable_NODEFAULT=>sub{variable([4,3,2,1])}

在这一行中,我们创建一个数组。不在本例中:
VARIABLE\u DEFAULT=>sub{VARIABLE()},

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

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

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

Benchmark::cmpthese(
  -10,
  {
    VARIABLE_DEFAULT => sub { VARIABLE() },
    VARIABLE_NODEFAULT => sub { VARIABLE($defaultArray) },
  }
);
速率变量\u NODEFAULT变量\u默认值 变量默认值1619427/s--4% 变量_默认值1689428/s 4%--
我会说,因为默认情况下,每个调用使用一个相同的数组,而NODEFAULT必须为每个调用分配和释放数组空间。与以下内容进行比较:

Benchmark::cmpthese(
  -10,
  {
    VARIABLE_DEFAULT => sub { VARIABLE() },
    VARIABLE_NODEFAULT => sub { VARIABLE($defaultArray) },
  }
);
速率变量\u NODEFAULT变量\u默认值 变量默认值1619427/s--4% 变量_默认值1689428/s 4%--
该死你比我快了11秒该死你比我快了11秒是的:)我要结束这个问题,但你们都应该得到一个+@OMG_peanuts:“问题已经回答了”并不是结束这个问题的有效理由,所以不要期望得到其他4票来结束这个问题。相反,你应该通过点击旁边的绿色复选标记来“接受”其中一个答案。是的:)我要结束这个问题,但你们都应该得到一个+@OMG_peanuts:“问题已被回答”被认为不是结束一个问题的有效理由,所以不要指望得到其他4票来结束这个问题。相反,您应该通过单击答案旁边的绿色复选标记来“接受”其中一个答案。不同的主题,但不要忘记您可以这样做:
join',@$arrayref
。不同的主题,但不要忘记您可以这样做:
join',@$arrayref