Mojolicious::Plugin::JSON_XSを書いた

@nqounetです.

MojoliciousでJSONを使う時は,renderメソッドにjsonを指定してやると変数をそのままJSONにして渡せるので簡単です.

1
2
my $args = { a => [1,2], b => 'c' };
$self->render(json => $args);

しかし,この時に使用されるMojo::JSONはPurePerlなので,できればXSのモジュール(JSON::XS)を使って高速化したいですよね.

ついでなので,便利に使えるJSONも一緒に測ってみます.

ソースコードは最後に載せていますので適当にお使いください.

1
2
3
4
5
6
7
8
# Benchmark: running json, mojo, xs for at least 3 CPU seconds...
#       json: 3.03104 wallclock secs ( 3.02 usr +  0.00 sys =  3.02 CPU) @ 173870.86/s (n=525090)
#       mojo: 3.19469 wallclock secs ( 3.17 usr +  0.00 sys =  3.17 CPU) @ 14308.83/s (n=45359)
#         xs: 3.16628 wallclock secs ( 3.15 usr +  0.00 sys =  3.15 CPU) @ 195861.27/s (n=616963)
#          Rate  mojo  json    xs
# mojo  14309/s    --  -92%  -93%
# json 173871/s 1115%    --  -11%
# xs   195861/s 1269%   13%    --

mojoはMojo::JSON,xsはJSON::XS,jsonは,JSONです.

JSON::XSの方がMojo::JSONよりも10倍以上速いですね.

JSONモジュールは,JSON::XSがあるとこれを使うのですが,若干差がありますね.

インスタンスを作るときなどに多少のオーバーヘッドがあるのかもしれません.

ちなみに,インスタンスを再利用するとこんな感じの結果になりました.

1
2
3
4
5
6
7
8
# Benchmark: running json, mojo, xs for at least 3 CPU seconds...
#       json: 3.18115 wallclock secs ( 3.16 usr +  0.00 sys =  3.16 CPU) @ 285812.66/s (n=903168)
#       mojo: 3.26202 wallclock secs ( 3.22 usr +  0.00 sys =  3.22 CPU) @ 14538.20/s (n=46813)
#         xs: 3.19833 wallclock secs ( 3.18 usr +  0.00 sys =  3.18 CPU) @ 309832.39/s (n=985267)
#          Rate  mojo  json    xs
# mojo  14538/s    --  -95%  -95%
# json 285813/s 1866%    --   -8%
# xs   309832/s 2031%    8%    --

…さらに差がつきましたね.

ここまで速いのであれば,使える環境なら使いたいですね.

最近は更新がないのでどこまで互換性があるか心配ではありますが,少し使ってみた感じでは問題ありませんでした.

使う時はいつもと同じようにpluginメソッドで呼び出すだけです.

1
2
3
4
5
# Mojolicious::Lite
plugin 'JSON_XS';

# Mojolicious
$app->plugin('JSON_XS');

正直なところ,JSON部分だけが速くなってもあまり効果はない気がします.

ただし,とてつもなく大きなJSONをやりとりする機会があるなら使えると思います.

ハンドラーを書き換える方法はこちらをどうぞ.

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。