Java VM別の簡単なベンチマークをしてみた

最近のJavaは速い。

この言葉は良く聞くけど基本Java1.2とか1.4みたいな古代のバージョンと比較してのこと(まだ動いてそうだが...)

最近のバージョンはどうなんだろう? と気になったのだけど、あんまりVM毎のベンチって出回って無さそうだったので、試しに実施してみた。 本当はベンチマークキットみたいな適切なベンチ項目があれば良いのだけど、良いのが見当たらなかったので、とりあえず自前で適当に。

評価項目は下記の通り。

  • StringBuilderによる文字列結合(100,000,000回)
  • プラス演算子による文字列結合(100,000回)
  • リフレクションによるプロパティアクセス
  • BeanUtilsによるプロパティアクセス

結果はそれぞれ10回呼び出して計測時間の中央値を使ってる。実行した時のマシン状況による差分を多少でも減らすために、一応2回実行してみた。ソースコードはこちら

実行結果は下記の通り。

concat string with StringBuilder(100,000,000) concat string with plus(100,000) replace string with regular expression property access with refrection property access with beanutils
Apple Inc. Java HotSpot(TM) 64-Bit Server VM 1.6.0_65(1回目) 1428.5 12100.5 4434 1133.5|1783
Apple Inc. Java HotSpot(TM) 64-Bit Server VM 1.6.0_65(2回目) 1194.5 10400 3012 1076.5|1726
Oracle Java HotSpot(TM) 64-Bit Server VM 1.7.0_65(1回目) 1166.5 2135 2768.5 2037.5|1785.5
Oracle Java HotSpot(TM) 64-Bit Server VM 1.7.0_65(2回目) 1133 2178 2828.5 2040.5|1754.5
Oracle Java HotSpot(TM) 64-Bit Server VM 1.8.0_11(1回目) 1170 1788 2363 2144.5|1900
Oracle Java HotSpot(TM) 64-Bit Server VM 1.8.0_11(2回目) 1209.5 1779.5 2202.5 2087.5|1942.5

評価項目のせいかもだけど、あまり劇的に性能が変わるところは無さそう。プラス演算子による文字列結合だけやたら1.6で遅いのは、1.6はApple製なことと影響してるのかな? Linuxでも測ってみる必要もあるな。

正規表現と文字列結合は順調にバージョンが上がる毎にパフォーマンスが向上してるみたい。リフレクション周りが少し微妙だけど他の性能を上げるために犠牲になったのかな?

1.8でPermMemoryの使い方とかも変わってるので、メモリとかをもっといっぱい使うようなベンチをちゃんと作らないと面白いデータは取れ無さそう。

まあ、少なくとも遅くなってないことはわかったので、それはそれで収穫か。

それではLet's Happy Hacking!