什么是java编译器的优化级别?
因此,让我们考虑一下在循环中执行超过一百万次的以下语句。什么是java编译器的优化级别?
boolean validity = condition1 || condition2;
它是安全的假定这两个条件1和条件2有内部起来很复杂的计算。如此以来,这里有个OR运营商,我相信它会是明智的单独检查条件1第一,然后,如果有必要,条件2后像,
boolean validity = condition1;
if(!validity)
validity = condition2;
我应该手动执行这样的优化,还是java编译器会自动处理这些事情?
由于Java语言规范,§15.24说:
的条件,或运营商
||
操作就像|
(§15.22.2),但评估其右边的操作数只有在其左侧操作数的值假。
因此它需要通过语言规范,正确的部分evalutated仅如果离开的部分是假的。这不是一种优化,它是语言的一部分。优化不是语言规范的一部分,它们可能会让你的代码更快,但它们绝不应该让你的代码行为不同。然而,在这里,如果两个部分都被评估为正确的部分可能有副作用,那么行为将会不同。
感谢您的回答Tagir。那么是否有任何情况下,一个急于运行的电路比短路电路更受欢迎? – Kiran
@KiranR,其实我不知道这种情况。当检测到非短路布尔表达式时,FindBugs尝试[报告](http://findbugs.sourceforge.net/bugDescriptions.html#NS_NON_SHORT_CIRCUIT),我不记得有人抱怨说这种报告是假阳性的(我是FindBugs的贡献者)。可能它是在Java 1.0中添加的,以便更接近于C ...当然'|'对于int/long类型非常有用,但不适用于布尔型。 –
java编译器首先能够执行condition1的函数。当它为true时,condition2的函数不再执行。所以优化不是必需的。这是因为有一个OR操作。
显然你没有看到答案。相比于其他我写的完全一样。但没有提及规范。 –
应该是非常简单的测试 – Paul
https://en.wikipedia.org/wiki/Short-circuit_evaluation –
或者如果condition1为true,操作将永远不会检查condition2。 –