IT Office Nishimiyahara

個人用スマホから商用プログラミングまでなんでもお任せ下さい

Mojolicious::Plugin::JSON_XSを書いた

      2014/02/24

@nqounetです.

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

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

計測

その前に,Mojo::JSONとJSON::XSではどのくらい速度が違うのかを調べてみます.

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

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

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

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

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

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

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

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

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

MojoliciousでJSON::XSを使う

MojoliciousでJSON::XSを使う場合は,Mojo::JSON::XSが便利です.

Mojo::JSONとメソッドの互換性があり,JSON::XSでは使えないtrueやfalseも使えます.

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

プラグインを書いた

使い方としては,rendererのadd_handlerでjsonのハンドラを上書きする方法が安全ですが,render以外でもMojo::JSONを利用している部分があるので,大胆にMojo::JSON::newを(再)定義してやります.

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

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

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

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

余談

こんなことを考えたのは,この記事がきっかけでした.

JSON::XSを使いたい気持ちはわかるので.

ベンチマークのソース

ということで,忘れかけていたベンチマークのソースです.

respo

respo link

ZenBackWidget

 - 情報技術について ,