Class::Accessor::Fast::XSのベンチを取ってみた
Class-Accessor-Fast-XS-0.04 - XS replacement for Class::Accessor::Fast - metacpan.org
Mooseブームも一段落したところでこんなん出てたからベンチ取ってみた。
package ClassAccessor; use strict; use warnings; use base qw/Class::Accessor/; __PACKAGE__->mk_accessors(qw/foo bar/); package ClassAccessorFast; use strict; use warnings; use base qw/Class::Accessor::Fast/; __PACKAGE__->mk_accessors(qw/foo bar/); package ClassAccessorFastXS; use strict; use warnings; use base qw/Class::Accessor::Fast::XS/; __PACKAGE__->mk_accessors(qw/foo bar/); use strict; use warnings; use Benchmark ':all'; cmpthese( timethese( 50000, { 'ClassAccessor' => sub { my $class = ClassAccessor->new( { foo => 'foo', bar => 'bar' } ); $class->foo; $class->bar; $class->foo('bar'); $class->bar('foo'); $class->foo; $class->bar; }, 'ClassAccessorFast' => sub { my $class = ClassAccessorFast->new( { foo => 'foo', bar => 'bar' } ); $class->foo; $class->bar; $class->foo('bar'); $class->bar('foo'); $class->foo; $class->bar; }, 'ClassAccessorFastXS' => sub { my $class = ClassAccessorFastXS->new( { foo => 'foo', bar => 'bar' } ); $class->foo; $class->bar; $class->foo('bar'); $class->bar('foo'); $class->foo; $class->bar; }, } ) );
結果
Benchmark: timing 50000 iterations of ClassAccessor, ClassAccessorFast, ClassAccessorFastXS... ClassAccessor: 1 wallclock secs ( 1.50 usr + 0.00 sys = 1.50 CPU) @ 33333.33/s (n=50000) ClassAccessorFast: 1 wallclock secs ( 0.94 usr + 0.00 sys = 0.94 CPU) @ 53191.49/s (n=50000) ClassAccessorFastXS: 1 wallclock secs ( 0.74 usr + 0.00 sys = 0.74 CPU) @ 67567.57/s (n=50000) Rate ClassAccessor ClassAccessorFast ClassAccessorFastXS ClassAccessor 33333/s -- -37% -51% ClassAccessorFast 53191/s 60% -- -21% ClassAccessorFastXS 67568/s 103% 27% --
思った以上に速くなってる。