Mooseが速いわけ
Mooseは起動に異様に時間はかかるし,クラス階層が複雑でどこから読み始めたらいいのかわからなかったのですが,使い始めるとなるほどこれはすばらしい。しかも,実行速度についてはかなり高速なんですね*1。
なぜ速いのかは追いきれてませんが,Memoizeしたりインライン展開したりしてるみたいです。Class::MOPを読んでいると,こんな感じのinline_xxx()が沢山ありました。
package Class::MOP::Instance; # ... sub is_inlineable{ 1 } # ... sub inline_slot_access { my ($self, $instance, $slot_name) = @_; sprintf "%s->{%s}", $instance, $slot_name; } # ...
なるほど,インライン化を駆使すれば速くなって当然ですね。
ところで,InsideOutオブジェクトではこのようなインライン展開はできないはず。ではMooseX::InsideOutはどうなっているのか?実装を見てみると…
package MooseX::InsideOut::Meta::Instance; #... use Hash::Util::FieldHash::Compat qw(fieldhash); # ... # don't touch this or I beat you # this is only a package variable for inlinability fieldhash our %__attr; # ...
ああなるほどね…ってこれじゃ「うっかりミス」を防げるだけで,全然カプセル化していないじゃないか!
*1:make_immutableさえすれば