Mooseの速度が遅いという議論のまとめと感想

Adam Kennedy (ADAMK)が「Array::CompareでMooseを使わないようにしてくれ」とRTでチケットを作成したことがきっかけとなり,Mooseの速度について議論が起きています。以下ラフなまとめ。

  • #49270: Remove the use of Moose - RT
    • Array::CompareではMooseを使わないでほしい。Mooseを使いつづけるならばコマンドラインアプリケーションでは使うに堪えないし,PadreでもArray::Compare依存をなくすつもりだ。
  • Moose or No Moose - Perl Hacks (Array::Compareの作者ブログ)
    • 最近いくつかのモジュールをMoose化しはじめたのだが,「Mooseを使うな」と言われてしまった。Mooseは楽なので使い続けたいが,どうしたものか。
  • Re: Moose Or No Moose - Stevan Little's Blog
    • ADAMKのいうことは分からんでもない。それでもMooseは使う価値がある。Moose高速化計画も進んでいることだし。
  • On Moose and Speed - A Foolish Manifesto
    • Mouseという手もあるが,Moose開発メンバーは「MouseよりMoose使って」って言ってるからなあ。今後に期待したいのが,MooseX::AntlersというMooseの機能をMouseの速度で提供する計画だな。

Moose高速化計画に関して言えば,ある程度改善はされるものの,おそらくMouse並にはならない*1でしょう。とはいえやはり遅いのは非常に大きな欠点なので,もう少し頑張りたいところです。MooseX::Antlersにも期待します。

そもそも,他のモジュールのスタートアップがプログラムのコンパイルだけであるのに対して,Mooseコア/アプリケーションではコンパイルの他に大量のメタオブジェクトの生成しなければならないので,時間がかかるのも当然と言えます。

それではコマンドラインアプリケーションとして使用に耐えないかというと,そうでもないんじゃないでしょうか。いくつかのPerlアプリケーションを見てみると,ack(1)の50ms,prove(1)の90ms,perltidy(1)の300ms, cpan(1)の300msに対して,Mooseを使っているre.pl(1)の370msは確かに遅いんですが,絶望的に遅いというわけでもないのでこんなものかな,とも思います。

(追記)
さっそくNishinoさんが「Moose or No Moose」を翻訳しています。

(追記 2)
議論はその後も続いています。時間があれば要約します。

*1:今作成中のすべてのブランチがマージされたとしても,まだMouseよりはるかに遅い。ただし,XS化しているため実行速度はMouseを凌駕する。