Java用JSONパーザのベンチマークをした話
このたび JSON パーザのベンチマークを書きましたので、どうぞご査収下さい。
Java8 がインストール済みの環境で、当該リポジトリを clone して
./gradlew jmh
と実行する事で追試できます。
結果について
jackson-databind が最速なので殆どの皆様におかれましては安心して下さい。
特に驚きに値するような事は何も起きていません。
僕のマシンで実行した結果はこちらです。(エビデンスが無いとの指摘を受け追記しました。)
結構な長文になってしまいましたので、マニアな皆様だけが続きを読んで下さい。
課題設定について
まず、おおまかな課題設定について説明します。
- JMH を使った本格的なベンチマークを書く
- Java 用 JSON パーザのショーケースを作る事で使い易いも のを明らかにする
- 結局どのパーザが速いのか調べる
JMH について
そもそもが Java のマイクロベンチマークというのは極めて趣味的なものであって、多くの人にとって余り益のない行為です。
一方で、ベンチマークプログラムを書く事は実行ランタイムに対する不必要な程の詳細な理解を得られる数すくない手段の一つでもあります。
また、正しいベンチマークプログラムを書くのは非常に難しいものです。 特に JVM には非常に強力な最適化の仕組みがありますので、それらの仕組みを目的通りに動かしたり止めたりするのは極めて難しいと言えます。
そこで利用できるベンチマークライブラリが OpenJDK の一部として公開されているJMHです。
JMH は非常に便利ですがドキュメントが壊滅的です。僕が参考にしたサイトは以下の 4 つです。
JMH のサンプルコードは単一の機能を使うという意味では分かり易いのですけども、充実したサンプルコードという意味では、GS Collections のベンチマークがオススメです。僕の観測範囲では GS Collections が一番 JMH を使っています。
JMH は基本的に Maven からの利用を想定しています。
一応、Gradle のプラグインも公開されているのですが細かい所でドキュメントやサンプルが無いのでコードを読みながら使わざるを得ません。また、非常に残念な事に JMH の Gradle プラグインは、ベンチマークプログラムを IDE 書く事を想定した作りになっていません。
最初の課題として
- Gradle から JMH をカジュアルに動かせるようにする
- Gradle の eclipse タスクや idea タスク等から IDE 用設定ファイルを適切に生成できるようにする
の二つを解決しました。その結果が、
です。eclipse では Annotation Processor 用の設定ファイルを生成するのが非常に面倒なのですけども、tbroyer/gradle-apt-pluginを使うと簡単に設定できます。尚、Android 用のプラグインはhvisser/android-aptです。
これによって、eclipse 上から main メソッドを持つクラスを指定して Java アプリケーションとしてベンチマークを動かせるようになりました。