13

この質問への回答に関する議論に基づいて、Java Hotspot オプティマイザーの非常に奇妙な動作を発見しました。観察された動作は、少なくとも Oracle VM 1.7.0_17 で確認できますが、古い Java 6 バージョンでも発生するようです。

まず第一に、標準 API のいくつかのメソッドは不変であり、副作用がないことをオプティマイザーが明らかに認識していることはすでに認識していました。のようなループを実行する場合double x=0.5; for(double d = 0; d < Math.sin(x); d += 0.001);、式Math.sin(x)は反復ごとに評価されませんが、オプティマイザーは、メソッドMath.sinに関連する副作用xがなく、ループ内で変更されない限り、結果が不変であることを認識しています。

x0.5 から 1.0 に変更するだけで、この最適化が無効になることに気付きました。さらにテストを行うと、abs(x) < asin(1/sqrt(2)) の場合にのみ最適化が有効になることがわかります。それには正当な理由がありますが、それはわかりませんか、それとも最適化条件に対​​する不必要な制限ですか?

編集:最適化は hotspot/src/share/vm/opto/subnode.cpp に実装されているようです

4

1 に答える 1