this質問に対する回答を中心に議論したところ、Javaホットスポットオプティマイザの実際の動作は非常に奇妙です。観察された動作は、少なくとも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)
は各反復で評価されませんが、ループ内でx
が変更されない限り、メソッドMath.sin
には関連する副作用がなく、結果は不変であることがオプティマイザによって認識されます。
ここで、x
を0.5から1.0に変更するだけで、この最適化が無効になることがわかりました。さらなるテストでは、abs(x)< asin(1/sqrt(2))の場合にのみ最適化が有効になることが示されています。私には分かりませんが、それは最適な条件の不必要な制限ですか?
編集:最適化は、数学の実装は実装依存であるので、私は、特にOracle JVMに関するご質問を考えてホットスポット/ srcに/共有/ VM /光/ subnode.cpp
「式Math.sin(x)は各反復で評価されません」ということをどのように知っていますか?あなたはアセンブリコードを見ましたか?または測定時間?また、 'Math.sin'はJava 1.7の組み込みメソッドであることに注意してください。コード実行はJDKソースに表示されるJavaコードではありません。 – assylias
@assylias:時間を測定することによって、しかし良い点があります。私は引数
jarnbjo
@jarbjo x86_64 cpusの実装は、次のとおりです。http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/6e9aa487055f/src/cpu/x86/vm/stubGenerator_x86_64.cpp(2878行目) – assylias