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