Xslate vs. JSON::XS
(追記あり)
Xslate 0.1033ではsort/mapにブロックを渡せるようになった。
<: $a.sort( -> $a, $b { $a.title cmp $b.title } ).join(", ") :> <: $a.map( -> $x { $x + 1 } ).join(", ") :>
ところで[twitter:@xaicron] さんによれば、JavaScriptが使える端末向けの場合は、テンプレートエンジン使うよりJSONで吐き出すことが多いということであった。それならば、JSON::XSとの差も測定しておいたほうがいいだろう、ということでベンチマークしてみた*1。
$ perl benchmark/json.pl Perl/5.10.1 i686-linux Text::Xslate/0.1033 JSON::XS/2.29 Rate xslate json xslate 18101/s -- -53% json 38711/s 114% --
結果は御覧の通り、JSON::XSのほうが2倍も高速である。
しかし、これはある当然といえよう。JSON::XSは配列をエンコードするためのループをCで書いている一方で、Xslate はループをVMで実行しているため、どうしてもマシンコードを直接実行するよりも遅くなる。逆にいえば、VMで行っているループを何らかの形でCのループに還元できれば、JSON::XSに匹敵するほど高速になる可能性が高い。これを実装するアイデアはあるので、JSON::XSに近づけることはできるだろう。
(2010/7/5 追記)
Direct threaded codeなどの最適化を経たバージョン0.1041の時点では、ベンチマークの結果は以下の通り。だいぶ近づいたがまだ届かない。
]$ perl benchmark/json.pl Perl/5.10.1 i686-linux Text::Xslate/0.1041 JSON::XS/2.29 Rate xslate json xslate 23866/s -- -38% json 38745/s 62% --
(2010/8/2 追記)
出力ルーチンの最適化を経たバージョン0.1054の時点では以下の通り。今や大きな違いではなくなった。速度のためにJSONにする、という選択肢はもう考える必要はないだろう。
$ perl benchmark/json.pl Perl/5.10.1 i686-linux Text::Xslate/0.1054 JSON::XS/2.29 Rate xslate json xslate 35223/s -- -10% json 39097/s 11% --