Javaの実行速度を調べるなら、ClientVM/SeverVM の違いを考慮しておくべきでした。

先日のJava7 で ArrayList の foreach が速くなった理由を調べてみました。 - 地平線に行くについて、お詫びと訂正です。


上記の記事の中で、「ArrayList の foreach文(拡張for文)がJava6 → Java7 で約2.5倍速くなっていました。」という実験結果を記載しました。
しかし、改めて -server オプションをつけて実験したところ、Java6 → Java7 で実行速度は変わらないことがわかりました。*1

foreach 文が速くなったのは ClientVM の場合だけ

ClientVM と ServerVM、それぞれで実験を行った結果は以下の通りです*2
(実験内容は、前回と同じく 要素10,000個 のリスト × 1,000回ループ です)


List × foreach List × for
Java6 (Client) 342.80 ms 191.22 ms
Java7 (Client) 132.39 ms 114.37 ms
Java6 (Server) 43.11 ms 28.44 ms
Java7 (Server) 40.60 ms 29.11 ms


結果として、Java6 → Java7 で速くなるのは ClientVMの場合だけでした。
そのため、eclipse のようなクライアントアプリケーションでもない限り、実行速度の変化はほぼないと考えられます。


Javaで実行速度について調べるのであれば、この ClientVM/ServerVM の違いを考慮しておくべきでした。
誤解を伴う記事を広めてしまったことを、お詫び申し上げます。

*1:元の記事では、オプションなし(= ClientVM)で実験していました。

*2:今回は ClientVM は ServerVM よりも遅いという結果になっていますが、「ClientVM は起動時間、メモリ使用量、GUI に対して最適化されている」とのことなので、必ずしも遅いというわけではなさそうです。参考:jvm - Real differences between "java -server" and "java -client"? - Stack Overflow