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!