日向夏特殊応援部隊

俺様向けメモ

Moose::Cookbook::Recipe7 - make_immutable -

今度は make_immutable について。

ソース

package PointImmutable;

use Moose;

has 'x' => (isa => 'Int', is => 'ro');
has 'y' => (isa => 'Int', is => 'rw');

__PACKAGE__->meta->make_immutable;

package PointNoImmutable;

use Moose;

has 'x' => (isa => 'Int', is => 'ro');
has 'y' => (isa => 'Int', is => 'rw');

package PointCAF;

use base qw(Class::Accessor::Fast);

__PACKAGE__->mk_accessors(qw/x/);
__PACKAGE__->mk_ro_accessors(qw/y/);

package main;

use Benchmark qw(cmpthese);

my $count = shift @ARGV || 200000;

cmpthese($count, {
    immutable => sub { PointImmutable->new(x => 10, y => 20) },
    no_immutable => sub { PointNoImmutable->new(x => 10, y => 20) },
    class_accessor_fast => sub { PointCAF->new({ x => 10, y => 20 }) }
});

解説

今度はベンチマークです。手元でコマンド引数なし、つまり200000回のイテレーションベンチマークしてみました。

                        Rate    no_immutable       immutable class_accessor_fast
no_immutable          4131/s              --            -96%                -99%
immutable           116279/s           2715%              --                -65%
class_accessor_fast 327869/s           7838%            182%                  --

と言う訳で make_immutable した方が、しない方よりも27倍ほど早い。(今はMacOSXでのベンチマークです、ちなみに)
また Class::Accessor::Fast とも比較しましたが、こちらは make_immutable しても及ばす 1.8倍ほど Class::Accessor::Fast 版のが早い。

この事から分かる通り、Moose ベースで何か作る際には make_immutable しないと全然実用的なスピードが出ないって事ですね。

SEE ALSO