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
- http://d.hatena.ne.jp/tokuhirom/20080504/1209891158 - 既に id:tokuhirom が解説済みなので詳しくはそっちで