Class::Method::Modifiers::Fast
Angelosのプラグイン機構はMouseに依存しているので、Mouseを高速化しなければ速度の改善は見込めません。そこで、id:gfxさんのData::Utilを使って、Class::Method::Modifiers互換のインターフェースをもつ、高速なmethod modifierを実装してみました。
以下、ベンチ結果ですが、Mouseが使っているClass::Method::Modifiersの実装より2倍以上も高速なことがわかります。
id:gfxさんの神がかったXSの力のお陰ですね。gfx++ ! 僕もこんなXSが書けるようになりたいものです。
BEFORE Benchmark: running ClassMethodModifiers, ClassMethodModifiersFast, Moose for at least 5 CPU seconds... ClassMethodModifiers: 5.55378 wallclock secs ( 5.37 usr + 0.00 sys = 5.37 CPU) @ 382244.69/s (n=2052654) ClassMethodModifiersFast: 5.19569 wallclock secs ( 5.15 usr + 0.00 sys = 5.15 CPU) @ 721696.50/s (n=3716737) Moose: 5.37193 wallclock secs ( 5.35 usr + 0.00 sys = 5.35 CPU) @ 289563.74/s (n=1549166) Rate Moose ClassMethodModifiers ClassMethodModifiersFast Moose 289564/s -- -24% -60% ClassMethodModifiers 382245/s 32% -- -47% ClassMethodModifiersFast 721697/s 149% 89% -- AFTER Benchmark: running ClassMethodModifiers, ClassMethodModifiersFast, Moose for at least 5 CPU seconds... ClassMethodModifiers: 5.42181 wallclock secs ( 5.29 usr + 0.00 sys = 5.29 CPU) @ 273605.67/s (n=1447374) ClassMethodModifiersFast: 5.434 wallclock secs ( 5.36 usr + -0.01 sys = 5.35 CPU) @ 721437.01/s (n=3859688) Moose: 5.48908 wallclock secs ( 5.45 usr + 0.00 sys = 5.45 CPU) @ 276198.17/s (n=1505280) Rate ClassMethodModifiers Moose ClassMethodModifiersFast ClassMethodModifiers 273606/s -- -1% -62% Moose 276198/s 1% -- -62% ClassMethodModifiersFast 721437/s 164% 161% -- AROUND Benchmark: running ClassMethodModifiers, ClassMethodModifiersFast, Moose for at least 5 CPU seconds... ClassMethodModifiers: 5.4439 wallclock secs ( 5.52 usr + 0.00 sys = 5.52 CPU) @ 377432.25/s (n=2083426) ClassMethodModifiersFast: 5.15217 wallclock secs ( 5.12 usr + 0.00 sys = 5.12 CPU) @ 393749.80/s (n=2015999) Moose: 5.97819 wallclock secs ( 5.90 usr + 0.00 sys = 5.90 CPU) @ 305241.86/s (n=1800927) Rate Moose ClassMethodModifiers ClassMethodModifiersFast Moose 305242/s -- -19% -22% ClassMethodModifiers 377432/s 24% -- -4% ClassMethodModifiersFast 393750/s 29% 4% -- ALL THREE Benchmark: running ClassMethodModifiers, ClassMethodModifiersFast, Moose for at least 5 CPU seconds... ClassMethodModifiers: 5.08047 wallclock secs ( 5.00 usr + 0.00 sys = 5.00 CPU) @ 136121.20/s (n=680606) ClassMethodModifiersFast: 5.57851 wallclock secs ( 5.45 usr + -0.01 sys = 5.44 CPU) @ 264608.82/s (n=1439472) Moose: 5.27847 wallclock secs ( 5.28 usr + 0.00 sys = 5.28 CPU) @ 131580.11/s (n=694743) Rate Moose ClassMethodModifiers ClassMethodModifiersFast Moose 131580/s -- -3% -50% ClassMethodModifiers 136121/s 3% -- -49% ClassMethodModifiersFast 264609/s 101% 94% -- INSTALL AROUND Benchmark: running ClassMethodModifiers, ClassMethodModifiersFast, Moose for at least 5 CPU seconds... ClassMethodModifiers: 5.3693 wallclock secs ( 1.81 usr + 3.33 sys = 5.14 CPU) @ 50794.75/s (n=261085) ClassMethodModifiersFast: 6.12176 wallclock secs ( 1.57 usr + 4.30 sys = 5.87 CPU) @ 45358.43/s (n=266254) Moose: 21.7701 wallclock secs (21.19 usr + 0.29 sys = 21.48 CPU) @ 86.87/s (n=1866) Rate Moose ClassMethodModifiersFast ClassMethodModifiers Moose 86.9/s -- -100% -100% ClassMethodModifiersFast 45358/s 52113% -- -11% ClassMethodModifiers 50795/s 58371% 12% --
Class::Method::Modifiers::FastはMouseのほうにも取り込んであるので、Mouseも0.15からはmethod modifiersのbefore/afterが劇的に早くなります。あわせて、Mouse::Util::TypeConstraintsなども、Data::Utilの適用で、2倍以上の高速化が実現できるので、それもパッチとして適用していきたいと思っています。
# Mouse.xsすごいほしいなぁ。こういうのをさくっと書けるようになりたいなぁ。