JSONライブラリのパフォーマンス比較

つい先日、Androidアプリで使えるJSONライブラリ比較という記事で例によってJSONICパフォーマンス悪い、という話が出ており、個人的には必要性を感じていないものの、悔しいのでパース側も高速化してみることにしました。

というわけで、本日、いわゆるプルパーサ機能とパースの高速化を図った、JSONIC 1.3.0 ベータ1をリリースした次第なので、その結果について書いておこうと思います。ちなみにプルパーサ機能自体は、GsonにもJacksonにもあるので、JSONICもようやく機能面で追いついた形になります。

JSONICを作り始めた時代にはJSONを扱うライブラリにろくなものがなく、org.jsonの純正ライブラリと使い勝手の悪いjson-libしかないという状況でした。その当時の水準から言えば、JSONICは十分過ぎるほど高速だったのですが、時代も過ぎJSON全盛時代の現代では、とても早いとは言えない状況になってしまっていたわけです。

今回も、前回同様Jacksonに加え、前述の記事で早いとされていたGsonも加えてみました(今回JSONICで行った高速化手法はGsonをお手本にしています)。データは、日本郵便のページからダウンロードできる郵便番号データCSV(12万件)を配列の配列形式JSONに変換したもの、およびオブジェクトの配列形式JSONに変換した二種類を用意して使用しています。結果は、それぞれ処理を10回ループさせて、4〜10回目の結果の平均値です(数字は秒)。

JSONIC(1.3.0b1) Gson(2.0) Jackson(1.9.3)
List ⇒ JSON 0.673 5.037 0.547
Map ⇒ JSON 1.744 9.515 1.208
Bean ⇒ JSON 1.713 21.918 1.258
JSON ⇒ List 1.260 1.250 0.686
JSON ⇒ Map 3.660 3.510 2.737
JSON ⇒ Bean 5.559 2.185 1.530

結果としては、JSONICのパースもGsonに並ぶくらいには高速化されたもののJacksonには遠く及ばずといった感じですかね(ていうかJackson相変わらず速すぎですが……)。JSONICJSON ⇒ Beanが遅いのは、JSONICは仕組み上、一度パース結果をMapにした後に指定したクラスに変換しているためで、直接変換しているGsonやJacksonには敵いません(これに対応すると互換性が保てないこともあり、今のところ対応するのは難しいかなぁ、と)。

まぁ、正直なところ、10万件で秒の世界ですから、1000万件以上あるJSONとか扱うのでなければ、ほとんど趣味の世界のような気もしなくはありません。そういう用途であれば、速度重視で開発が進められているJacksonを利用した方がいいような気がします。通常のWebシステムなら、GsonもJSONICもほとんど変わらない気もしますが、escapeScriptを用意したこともありJSONICの方が気持ち便利かなぁー、という感じでしょうか。