Results from JPA sponsorships of Moose/Class::MOP
Moose/Class::MOP開発スポンサー (JPA Sponsors Moose/Class::MOP Work)の報告です。
まずは現状ですが,Moose 0.90/Class::MOP 0.93のロード時間が約176msであるのに対し,ベースラインとしたMoose 0.88/Class::MOP 0.89のロード時間が約209msであるので,約18%高速になっています。当初の目的が20%以上であるので,目標値には達しなかったことになります。しかし,現状では作成中のブランチすべてが取り込まれたわけではないため,ゆくゆくはさらに高速になる見込みです。
今回行った高速化に大きく寄与したのは次の二点です。
- ボトルネックであったget_method_map()をできるだけ使わないようにした(C::MOP)
- C::MOPが生成するコードの一部を手で展開し,実行時evalを減らした(C::MOP)
JPAの支援のもとでMoose/MOPの開発を行うという計画はこれで終わりとなります。期間中牧さんには大変お世話になりました。大きなプロジェクトの一員としてコードを書くのは初めてで,思うようにいかないことも沢山ありましたし,牧さんにはだいぶご迷惑もおかけしましたが,それだけにとても有意義な体験でした。ありがとうございます。
さて,JPAの支援は終わりましたが,Mooseのと関わりは今後も続けていくつもりです。
まず,Moose/MOPについて予定している変更は以下の三点です。
- C::MOPが生成するコードのXS化
- 現在eval()で生成するのに使う時間が短くなるのみならず,コンストラクタ・アクセサの実行速度も高速になります。試験コードによれば8%ほど高速になる見込みです
- シンボル操作のXS化
- 主にadd_method()が高速化します。試験コードによれば2%高速になります。
- Mooseが生成するコードのXS化
- これによりMooseで作成したクラスがClass::XSAccessorで生成したクラスに匹敵するほど高速になりますが,まだ問題が多いため取り込まれるのはまだ先になります。
また,MouseについてもXS化を行おうと思っています。本来は,MouseはMooseが高速化されるまでのつなぎとしてのモジュールでした。しかし,Mooseで生成されるコードのXS化については考えなければならないことがあまりにも多いので,現状では実現はかなり難しそうなのです。そこで,それならば一旦Mouseで実装して動かしてみたいとSartakに提案したところ,Goサインが出たので,まずはMouse::XSを実装してみようということになりました。
報告は以上です。
JPAの皆さま,特に牧さんには重ねてお礼申し上げます。ありがとうございました!