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%                  --

思った以上に速くなってる。