2010-11-25 4 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よりもそんなに遅いですか?

+1

別のトピックをしていますが、これを行うことができますことを忘れないでください:以下との比較 ' ''、@ $ arrayref'に参加。 – FMc

答えて

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

Damn。あなたは11秒も早かったです。 ;) – musiKk

+0

ヤップ、見つかっそれ:) –

1

はそれを手に入れました。これは、パラメータの代わりに、外側の変数の使用ではなく、テスト自身:この行でVARIABLE_NODEFAULT => sub { VARIABLE([4,3,2,1]) } は、我々は配列を作成します。この商品には含まれていません:VARIABLE_DEFAULT => sub { VARIABLE() },

4

DEFAULTは1と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%     -- 
+1

うん:)私は質問を閉じるんだけど、あなたの両方が+ –

+3

@OMG_peanutsに値する:この辺りの問題を閉鎖する正当な理由とはみなされない「質問が回答されている」ので、それを実現させるために必要な他の4つの投票を得ることを期待しないでください。代わりに、回答の1つをその横の緑のチェックマークをクリックして「受け入れる」必要があります。 –

+1

@Dave Sherohman:はい、あなたは正しいです。 –

関連する問題