Github makes perl core hacking easier!

id:tokuhiromに促されてperlコアにMoose XSへ向けた拡張を書いてみたのだが,githuのおかげでパッチを書くのが簡単にできた。forkして,トピックブランチを作って*1,コードを書いて,テストして,p5p mailing listにポストして終わり。こんなに簡単だとは思わなかったので,今後はもっと積極的に取り組みたい。

さて,今回行った修正は,XSのからPerlのメソッドの呼び出しを高速化するというものだ。XS内で大量にメソッドを呼びまくるMoose XSにとっては非常に有効だと思われる。この修正の効果は,Pure Perlでも測ることができるので,ベンチマークをとってみた。

Result:

blead:
pp_method        2733378/s           --         -17%
pp_method_named  3276799/s          20%           --

tweak/method:
pp_method        3418041/s           --          -7%
pp_method_named  3674916/s           8%           --

予測では,Perl_call_method()が使用するPPコードであるpp_method*2が高速になっているはずである。これは2733378/sから3418041/sなので,25%ほど高速になっており,大成功といえる。

一方,なぜか普通のメソッド呼び出しを実行するpp_method_named*3までも10%ほど速くなっているように見えるが,その理由は定かではない。今回の修正でpp_method_namedの実装が非常に単純になったので,そのせいで高速になったのかもしれない。もっとも,これが遅くなったのなら苦しいが,速くなる分には問題はないだろう。

Script:

#!perl -w -Ilib
use strict;
use Benchmark qw(:all);
{
    package Foo;
    sub bar{ 42 }
}
my $foo  = bless {}, 'Foo';
my $meth = 'bar';
cmpthese -1 => {
    pp_method_named => sub{
        $foo->bar();
    },
    pp_method => sub{
        $foo->$meth();
    },
};
__END__

*1:最初はブランチを作らずに書いていたが,「トピックブランチ上でやってもらえると助かる」と言われたのでそうするようにした。forkしたのだから別にいいかと思ったが,そうでもないようだ。

*2:Perl側では,メソッド名を変数にした時に使われる

*3:Perl側では,メソッド名をリテラルで書いたときに使われる