2012-05-17 103 views
0

我寫一個方法,並想知道如果附帶的代碼是有效取決於它是怎麼寫的:高效的編程技術

public boolean isThreeOfKind(PlayingCard[] hand) 
    { 
//   if(hand[0].getRank() == hand[2].getRank()) 
//    return true; 
//   else if(hand[1].getRank() == hand[3].getRank()) 
//    return true; 
//   else if(hand[2].getRank() == hand[4].getRank()) 
//    return true; 

     return (hand[0].getRank() == hand[2].getRank() || 
       hand[1].getRank() == hand[3].getRank() || 
       hand[2].getRank() == hand[4].getRank()); 
    } 

所以你可以看到我有一個if else if語句可評論out和return語句基本上做同樣的事情,根據編碼標準,這會更有效率嗎?

+7

可讀性遠在這種情況下,比效率更有價值。使用哪個更容易理解。 – Jeffrey

+3

在遙遠的土地和語言中,邏輯操作比分支要快得多。但現代編譯器已經把我們全部變成了代碼猴,所以只需使用任何漂浮在你的船上的東西。 – Perception

+0

嗯看起來像'手'中的'玩牌'更好地按價值排序。花了我一分鐘來弄清楚這將是'一種三'。只是說' –

回答

9

效率沒有區別,但風格明顯不同,第二個更好。然而,這種特殊的邏輯真的只是

for (int i = 0; i < 3; i++) 
    if (hand[i].getRank() == hand[i+2].getRank()) return true; 
return false; 
+0

這個實現也將規模過去[0 ... 4]。 +1 –

+0

我特別喜歡它,因爲它更清楚代碼在做什麼 - 將升序系列的第i個成員與第(i + 2)個nd成員進行比較以確認三種類型。暗示升序系列(卡片排序),否則這將不起作用 - 這是現在另一個顯而易見的事情(任何錯誤將更容易識別)。 –

3

這種類型的問題可能會在CodeReview更好,因爲它更發表意見。但在我看來,閱讀非評論部分要容易得多,性能不應該擔心,直到它成爲一個問題(尤其是像這樣的事情)。有關更多信息,請參閱Wikipedia上的程序優化文章,特別是When to Optimize部分。

0

正如傑弗裏所說,我認爲在這種情況下可讀性比效率更有價值(我不會說這是一條通用規則)。

您可能會對Short-Circuit Evaluation這個概念感興趣。請注意,||是Java中的短路操作員。因此,如果第一條語句爲真(其他兩條不會被評估),您將獲得與if語句相同的效果。這就是說,我不確定這兩位代碼是否編譯成了相同的函數(它們可能取決於編譯器的實現)。 如果它們編譯不一樣,第二個可能會更快。

+0

你如何看待?我無法想象會有什麼不同,除非註釋掉的解決方案可能會更快,如果在所有這些出口點重複執行返回,未註釋的版本可能會跳到最後的公共出口點,其結果是然後共同創建「真」。 –

+0

這就是短路評估的要點。如果第一個爲真,那麼Java不會評估第二個實現中的第二個元素,就像if語句一樣。 編輯:我說這可能是慢的原因是因爲我不知道什麼機器代碼「if」語句編譯進去。我的猜測是,這兩個陳述會編譯相同,但我不積極。 – user986122

0

或者,如果你在方法和數組邊界檢查寧願只有一個出口點:

boolean found = false; 
for (int i = 0; !found && i < hand.length - 2; i++) 
    found = (hand[i].getRank() == hand[i + 2].getRank()); 
return found;