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

*1:aTHX/pTHX など

*2:blessed()でGETMAGICが2回呼び出されるというもの。実際には,これが問題になることはほとんどないと思われる。