How effective PERL_NO_GET_CONTEXT?
マルチスレッド版perlでは,perl.hをincludeする前にPERL_NO_GET_CONTEXTマクロを定義するとXSUBが速くなる。そのかわり,スレッドコンテキスト*1を意識しなければならない分,XSでのプログラミングがやや煩雑になる。
参考:perlguts
ところで,Scalar-List-UtilsはPERL_NO_GET_CONTEXTを使っていない。そこで,PERL_NO_GET_CONTEXTを付けてリリース版と比較してみた。
http://gist.github.com/261549
$ perl -Mblib benchmark-reftype.pl # patched Perl/5.10.0 on i686-linux-thread-multi, Scalar::Util/1.21 (snip) Rate reftype ref reftype 16059/s -- -40% ref 26795/s 67% -- $ perl benchmark-reftype.pl # on CPAN Perl/5.10.0 on i686-linux-thread-multi, Scalar::Util/1.22 (snip) Rate reftype ref reftype 14091/s -- -47% ref 26713/s 90% --
16059/14091 ≒ 1.14 ということで,10%強ほど高速になっている。効果の程はモジュールにもよるが,使う価値はあるといえる。
なお,Scalar-List-Utilsについては一つバグも見つけたので*2,それを直したうえで pull request をしておいた。
http://github.com/gfx/Scalar-List-Utils/tree/tweaks