2010-11-25 62 views
1

运行下面的代码:为什么子例程参数使用比外部变量慢?

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版本这么多不是默认的一个慢?

+1

不同的主题,但不要忘记,你可以这样做:`加入 '',@ $ arrayref`。 – FMc 2010-11-25 11:39:02

回答

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%     -- 
+3

该死的。你快了11秒。 ;) – musiKk 2010-11-25 09:58:32

+0

邑,发现它:) – 2010-11-25 09:59:26

1

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

4

我会说,因为默认情况下使用一个和每个呼叫同一阵列而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%     --