2011-12-11 20 views
-4

我想知道這個說法是否有區別。java「if」和「if-else」的性能

public String returnSomething() { 
    String result = null; 
    if(isOK) { 
    result = "YES"; 
    } 
    result = "NO"; 
    return result; 
} 

而這一次

public String returnSomething() { 
    String result = null; 
    if(isOK) { 
    result = "YES"; 
    } else {  
    result = "NO"; 
    } 
    return result; 
} 

哪一個具有最佳性能?哪一個是最佳做法?

+8

第一個有一個bug,第二一個沒有。 – Patrick

+0

如果你剛剛返回,那麼'返回isOk是什麼? 「是」:「不」;「 – luketorjussen

+1

如果兩者在根本上有所不同,那麼您在第一次時不會返回。 – clyfe

回答

4

isOK == true兩者不相等。第一種方法將返回「否」,後者爲「是」。

如果您在第一個示例中的if之前放置了賦值,它們將返回相同的結果。

+0

我希望這是一個錯字! – luketorjussen

+0

哦對不起第一示例被認爲是這樣 如果(ISOK){ 結果=「YES」; 返回結果; } – Roge

2

拋開這兩種構造在邏輯上的不同表現。
他們不一樣。

在第一種情況下result將被設置爲No不論第一if條件是true
在第二種情況下,只有在第一個if條件不是true時,resut將設置爲No

基本上,你試圖在這裏比較蘋果和梨。

3

如果進一步深入並在微處理器級別查看,if和else條件就足夠快,因爲它們只是跳過地址並跳轉到由指令集組成的不同地址。所以在上述情況下,兩者同樣快速。

但是,無論什麼是OK,第一種情況總是會返回「NO」,因此我認爲這在技術上是錯誤的。

2

這是一個很好的用例爲條件運算(有時也稱爲三元運算符):

public String returnSomething() { 
    return isOK ? "YES" : "NO"; 
} 

這樣做的性能應該是相同的任何其他合理的方法,但這種方法更簡潔,在我看來更容易閱讀(假設您瞭解條件運算符)。

1

我認爲你正在嘗試做的是如下:

public String returnSomething() { 

    String result = "NO"; 

    if(isOK) { 
    result = "YES"; 
    } 

    return result; 
} 
2

這是在性能上沒有顯著差異。但意義有所不同。 你的第一個片段是馬車。它總是返回"NO"。我相信你想寫如下:

public String returnSomething() { 

    String result = null; 

    result = "NO"; 
if(isOK) { 
    result = "YES"; 
    } 

    result = "NO"; 

    return result; 
} 

而且順便說一句這樣的預成熟的優化(甚至考慮這類優化的)可能會導致問題。代碼的可讀性更重要。您的代碼可以重寫爲以下內容:

public String returnSomething() { 
    return isOK ? "YES" : "NO"; 
} 

我認爲它更具可讀性,簡單且易於維護。

+0

第一代碼仍然是越野車,需要刪除該第二'結果=「否」'線。我也更喜歡2nd,但我瞭解到它的可讀性值得懷疑... –

1

第一個會慢一些,因爲你在這裏做兩項工作作爲@ALS上述指出。

這是因爲代碼不正確:)

1

對於你第一種方法,結果總是被設置爲「NO」。

1

你不應該做這個級別微的優化!

有可能到頭來你會花你的時間去用擲硬幣的準確答案。即使您編寫測試來進行基準測試,幾乎所有此類基準測試都沒有正確理解在JVM中實際執行哪些代碼。編譯器會爲你優化你的代碼,對於微型優化來說,它可能會更好,這可能會導致不同的代碼運行。

即使你發現這是更快,差別會那麼可以忽略,但不可能導致你的軟件的任何問題。所以任何真正的性能問題都是在別處我真誠地懷疑,這些差異將超過100毫秒100萬這樣的操作。

+0

非常感謝,我不知道編譯器優化了我的代碼。 – Roge

1

我相信看了你想到的第一個例子是這樣的:

public String returnSomething() { 
    if(isOK) { 
     return "YES"; 
    } 
    return "NO"; 
} 

因此沒有必要創建一個臨時變量!第二個例子沒有什麼不同。

編輯:我知道這僅僅是一個示例代碼,但是當涉及到命名成員變量,你可能要遵循一定的慣例(例如ISOK - > m_isOk)