2015-10-13 120 views
1

因此,让我们考虑一下在循环中执行超过一百万次的以下语句。什么是java编译器的优化级别?

boolean validity = condition1 || condition2; 

它是安全的假定这两个条件1条件2有内部起来很复杂的计算。如此以来,这里有个OR运营商,我相信它会是明智的单独检查条件1第一,然后,如果有必要,条件2后像,

boolean validity = condition1; 
if(!validity) 
    validity = condition2; 

我应该手动执行这样的优化,还是java编译器会自动处理这些事情?

+0

应该是非常简单的测试 – Paul

+5

https://en.wikipedia.org/wiki/Short-circuit_evaluation –

+0

或者如果condition1为true,操作将永远不会检查condition2。 –

回答

8

由于Java语言规范,§15.24说:

的条件,或运营商||操作就像|§15.22.2),但评估其右边的操作数只有在其左侧操作数的值假。

因此它需要通过语言规范,正确的部分evalutated仅如果离开的部分是假的。这不是一种优化,它是语言的一部分。优化不是语言规范的一部分,它们可能会让你的代码更快,但它们绝不应该让你的代码行为不同。然而,在这里,如果两个部分都被评估为正确的部分可能有副作用,那么行为将会不同。

+0

感谢您的回答Tagir。那么是否有任何情况下,一个急于运行的电路比短路电路更受欢迎? – Kiran

+0

@KiranR,其实我不知道这种情况。当检测到非短路布尔表达式时,FindBugs尝试[报告](http://findbugs.sourceforge.net/bugDescriptions.html#NS_NON_SHORT_CIRCUIT),我不记得有人抱怨说这种报告是假阳性的(我是FindBugs的贡献者)。可能它是在Java 1.0中添加的,以便更接近于C ...当然'|'对于int/long类型非常有用,但不适用于布尔型。 –

-1

java编译器首先能够执行condition1的函数。当它为true时,condition2的函数不再执行。所以优化不是必需的。这是因为有一个OR操作。

+0

显然你没有看到答案。相比于其他我写的完全一样。但没有提及规范。 –