ムースであろうとなかろうと、カプセル化を破ることは決して安全ではないと思います。
bull
テストは100倍遅くないことに注意してください。アクセサーを2回使用していることを忘れないでください。エンベロープの裏側では、1秒あたり1,000,000回の実行から1秒あたり2,000,000回のアクセスになります。ハッシュと比較すると、約6倍になります。ただし、これらのスローダウンをたくさん追加すると、合計することができます。
しかし、ムースが問題だとは思いません。同じことを行うMoose以外のクラスで試してみると、結果はそれほど良くありません。速度低下のほとんどは、通常のオブジェクト指向のメソッド呼び出しによるもののようです。を使用する非MooseクラスとMooseクラスの違いは、inc_counter
約2倍です。
ベンチマークは本当にトリッキーなものです。あなたは本当に異なる部分をからかい、適切なベースケースをテストすることを確実にするために一生懸命働く必要があります。あなたが野生の数を得るとき、あなたは懐疑論者として始めて、それらがそれほど野生でなくなるまで物事を調整するべきです。たとえば、ムースが遅いとしても、あなたが推測したように遅いと誰もそれを使うことはないと思います。少し遅いことは1つのことであり、次数または大きさはまったく別のことです。
ベンチマークにも興味があったので、で試してみたかったmake_immutable
です。これが、Lionを実行しているMacProでのMoose-2.0403を使用したデフォルトのPerl5.14.2の結果です。Bullは元のコードであり、Rockyはを使用しmake_immutable
、Natashaは同じことを行うMoose以外のクラスです。
Rate bull rocky natasha bull_counter rocky_counter natasha_x rocky_x bull_x natasha_counter rocky_direct bull_direct natasha_direct hash
bull 728177/s -- -6% -17% -42% -43% -65% -66% -67% -71% -93% -94% -94% -95%
rocky 771011/s 6% -- -12% -39% -39% -63% -64% -65% -70% -93% -93% -94% -95%
natasha 877713/s 21% 14% -- -30% -31% -58% -59% -60% -66% -92% -92% -93% -94%
bull_counter 1260308/s 73% 63% 44% -- -1% -40% -42% -42% -51% -88% -89% -89% -91%
rocky_counter 1274310/s 75% 65% 45% 1% -- -39% -41% -42% -50% -88% -89% -89% -91%
natasha_x 2105717/s 189% 173% 140% 67% 65% -- -3% -4% -17% -81% -81% -82% -85%
rocky_x 2163925/s 197% 181% 147% 72% 70% 3% -- -1% -15% -80% -81% -82% -85%
bull_x 2184533/s 200% 183% 149% 73% 71% 4% 1% -- -14% -80% -80% -82% -85%
natasha_counter 2548621/s 250% 231% 190% 102% 100% 21% 18% 17% -- -77% -77% -79% -82%
rocky_direct 10901037/s 1397% 1314% 1142% 765% 755% 418% 404% 399% 328% -- -3% -9% -24%
bull_direct 11202734/s 1438% 1353% 1176% 789% 779% 432% 418% 413% 340% 3% -- -6% -21%
natasha_direct 11939231/s 1540% 1449% 1260% 847% 837% 467% 452% 447% 368% 10% 7% -- -16%
hash 14252488/s 1857% 1749% 1524% 1031% 1018% 577% 559% 552% 459% 31% 27% 19% --
これが私のプログラムです:
#!/Users/brian/bin/perls/perl5.14.2
use v5.10.1;
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;
package Bullwinkle {
use strict;
use warnings;
use Moose;
has 'x' => (is => 'rw', default => 0);
# counter is also slow
has 'counter' => (
traits => ['Counter'],
is => 'ro',
isa => 'Num',
default => 0,
handles => {
inc_counter => 'inc',
},
);
}
package Rocky {
use strict;
use warnings;
use Moose;
has 'x' => (is => 'rw', default => 0);
# counter is also slow
has 'counter' => (
traits => ['Counter'],
is => 'ro',
isa => 'Num',
default => 0,
handles => {
inc_counter => 'inc',
},
);
__PACKAGE__->meta->make_immutable;
}
package Natasha {
use strict;
use warnings;
sub new { bless { 'x' => 0 }, $_[0] }
sub inc_counter { $_[0]->{x} += 1 }
sub x {
if( defined $_[1] ) { $_[0]->{x} = $_[1] }
else { $_[0]->{x} }
}
}
my $bull = Bullwinkle->new;
my $rocky = Rocky->new;
my $natasha = Natasha->new;
my $hash = { 'x' => 0 };
cmpthese(-1,{
bull => sub { $bull->x(1 + $bull->x ) },
bull_x => sub { $bull->x },
bull_direct => sub { ++$bull->{'x'} },
bull_counter => sub { $bull->inc_counter },
rocky => sub { $rocky->x(1 + $rocky->x ) },
rocky_x => sub { $rocky->x },
rocky_direct => sub { ++$rocky->{'x'} },
rocky_counter => sub { $rocky->inc_counter },
natasha => sub { $natasha->x(1 + $natasha->x ) },
natasha_x => sub { $natasha->x },
natasha_direct => sub { ++$natasha->{'x'} },
natasha_counter => sub { $natasha->inc_counter },
hash => sub { ++$hash->{'x'} },
});