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