2010-11-25 55 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%     -- 
相關問題