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 バージョンが DEFAULT バージョンよりもずっと遅いのはなぜですか?

4

3 に答える 3

4

呼び出すたびに新しい匿名配列参照を作成しているため、非常に遅くなります。コードを次のように変更します。

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%                 --
于 2010-11-25T09:57:34.157 に答える
4

DEFAULT は呼び出しごとに同じ配列を使用するのに対し、NODEFAULT は呼び出しごとに配列にスペースを割り当てて解放する必要があるためです。以下と比較してください。

Benchmark::cmpthese(
  -10,
  {
    VARIABLE_DEFAULT => sub { VARIABLE() },
    VARIABLE_NODEFAULT => sub { VARIABLE($defaultArray) },
  }
);
                        レート VARIABLE_NODEFAULT VARIABLE_DEFAULT
VARIABLE_NODEFAULT 1619427/秒 -- -4%
VARIABLE_DEFAULT 1689428/s 4% --
于 2010-11-25T09:57:45.013 に答える
1

とった。これは、外部変数の代わりにパラメーターを使用するのではなく、テストそのものです:VARIABLE_NODEFAULT => sub { VARIABLE([4,3,2,1]) } この行では、配列を作成します。これにはありません: VARIABLE_DEFAULT => sub { VARIABLE() },.

于 2010-11-25T09:56:11.790 に答える