この質問への回答に関する議論に基づいて、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
がなく、ループ内で変更されない限り、結果が不変であることを認識しています。
x
0.5 から 1.0 に変更するだけで、この最適化が無効になることに気付きました。さらにテストを行うと、abs(x) < asin(1/sqrt(2)) の場合にのみ最適化が有効になることがわかります。それには正当な理由がありますが、それはわかりませんか、それとも最適化条件に対する不必要な制限ですか?
編集:最適化は hotspot/src/share/vm/opto/subnode.cpp に実装されているようです