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%     --

*1:ベンチマークスクリプトはxslate/benchmark/json.pl