2015-10-13 41 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

顯然你沒有看到答案。相比於其他我寫的完全一樣。但沒有提及規範。 –