t*()
いつものように、この例のためにtrueを返すf*()
常にfalseを返します。
我々は、次の式があるとしましょう
if ( f1() || t1() || f2() || t2() ){
// do stuff
}
この場合はJVMが実行してのみ実行を最適化f1()
し、t1()
それは理解して"ために関係なく、どのようなことをf2()
してt2()
歩留まり、if文を入力するための要件が満たされ、それ以上の計算は必要ありませんそのため。
私はこのような何かを書いたコードに取り組んでいます:
boolean b = false;
b |= f1(); // A
b |= t1(); // B
b |= f2(); // C
b |= t2(); // D
私の同僚の一人は、これを見て、彼はわからないですが、ので、Javaは、文CとDを最適化することを可能かもしれないと述べてb
常にあるtrue
の文からB
以降、これはいくつかの問題につながる可能性があります。
私はいくつかのテストを実施し、それらのすべてが適切に実行されているかのように(これは望ましい動作である)ようだが、私はまだ思ったんだけど、この取得が最適化されていませんなぜですか?私は彼が正しいかもしれない考え出しとJVMはかつてのことを理解しb
、真の無さで|=
、それに対する操作は、その値を変更します。
これは、最適化されない理由を私はまだ思ったんだけど?
それは、JLSの違反になりますので。
声明
b |= f1();
に相当します
b = (boolean)(b | f1());
上記では、JLSは必要としているがb | f1()
、以下のように評価されています。
- の値を取得します
b
。 - 呼び出し
f1()
と結果の値をキャプチャ - 適用
|
二つの値に演算子を。
JLSはありません、コンパイラが呼び出しをスキップできるようにするf1()
場合b
であるtrue
1。
あなたがそのセマンティック(短絡)をしたい場合は、使用する必要があるb = b || f1();
とそうで。(あなたが指摘したように:b ||= f1()
構文エラーです。)
1 -実際には、状況にあること(シングルスレッドのプログラムで)観察することができませんでしたf1()
コールが起こっていないか、あった、最適化は、理論的には許されるでしょう。しかし、あなただけ慎重に調べることによって最適化を検出することができるようになり、ネイティブコード JITコンパイラによって放出されたが。コールは、厳密に副作用無料だった場合、それはそれだけで発生する可能性があります。