に比べ
BEGIN {
no strict 'refs';
for my $a ("aaaa".."zzzz"){
*{__PACKAGE__ . "::get_$a"} = sub { $_[0]->{$a} };
*{__PACKAGE__ . "::set_$a"} = sub { $_[0]->{$a} = $_[1] };
}
}
print `ps -F -p $$`; # adjust for your ps syntax
: 、例えば、これを試してみてください。ただし、文字列eval
を使用してサブルーチンを作成しない限り、これは通常不可能です。例えば、コードは、あなたが提供:
... = sub { $_[0]->{$a} };
は手動で書かれていたコードよりも、これまで、それほどわずかに遅くなります。前者はの値を取得する必要があり
sub foo { $_[0]->{'foo'} }
というだけの理由変数$ aをハッシュのキーとして使用する前に、後ではそのハッシュキーとして定数を使用します。また、脇の下として、shift
は、通常、$_[0]
よりも速くなる傾向があります。ここではいくつかのベンチマークコードは次のとおりです。
use Benchmark qw(cmpthese);
package Foo;
sub manual_shift { shift->{'foo'} }
sub manual_index { $_[0]->{'foo'} }
my $attr = 'foo';
*dynamic_shift = sub { shift->{$attr} };
*dynamic_index = sub { $_[0]->{$attr} };
package main;
my $o = bless { foo => 123 }, 'Foo';
cmpthese(-2, {
manual_shift => sub { my $a = $o->manual_shift },
manual_index => sub { my $a = $o->manual_index },
dynamic_shift => sub { my $a = $o->dynamic_shift },
dynamic_index => sub { my $a = $o->dynamic_index },
});
と私のシステム上の結果:
Rate dynamic_index manual_index dynamic_shift manual_shift
dynamic_index 1799024/s -- -3% -4% -7%
manual_index 1853616/s 3% -- -1% -4%
dynamic_shift 1873183/s 4% 1% -- -3%
manual_shift 1937019/s 8% 4% 3% --
彼らは違いがノイズで迷子ことがとても近くだが、多くの臨床試験の上に、私はあなたが見ると思います「手動シフト」の変形が最も速いことを意味する。しかし、このようなすべてのマイクロベンチマークと同様に、あなたのハードウェアとperlのバージョンを正確にテストして、何かを確認する必要があります。
ここには、ストリングevalがミックスされています。
eval "sub eval_index { \$_[0]->{'$attr'} }";
eval "sub eval_shift { shift->{'$attr'} }";
統計的ノイズをプラスまたはマイナスした「手動」バリアントとまったく同じである必要があります。私の結果は:
Rate dynamic_index manual_index dynamic_shift manual_shift eval_shift eval_index
dynamic_index 1820444/s -- -1% -2% -3% -4% -5%
manual_index 1835005/s 1% -- -1% -2% -3% -4%
dynamic_shift 1858131/s 2% 1% -- -1% -2% -3%
manual_shift 1876708/s 3% 2% 1% -- -1% -2%
eval_shift 1894132/s 4% 3% 2% 1% -- -1%
eval_index 1914060/s 5% 4% 3% 2% 1% --
繰り返しますが、これらはすべて、あなたがせっかくを取るとノイズから信号を整理するために多くの臨床試験を行う必要があるだろうことをとても近くにあります。しかし、ハッシュ・キーとして定数を使用することと、ハッシュ・キーとして変数(その値を最初に検索する必要がある)を使用することの違いは、一貫して示す必要があります。 (shift
の最適化は別の問題であり、perlの過去または将来のバージョンでどちらか一方を変更する可能性が高くなります)。
'* {" get_ $ a "} = sub' ...も動作するはずです。 (そこに '__PACKAGE__'は必要ありません) –