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