2011-08-03 65 views
0

我有兩個相同的條件,我想知道哪些是在perfomance?哪個代碼的性能比較好?

if(str_final.charAt(str_final.length() -1) == 'a' 
    || str_final.charAt(str_final.length() -1) == 'b') 
{ 
    // body 
} 

-------------------- OR --------------------

char temp = str_final.charAt(str_final.length() -1); 
if(temp == 'a' || temp == 'b') 
{ 
    // body 
} 
+8

真正的問題是哪些是可讀性? :) –

+12

談論可讀性......如何...'.endsWith(「a」)'? – giraff

+2

關注性能這樣一個微小的細節就像用剪刀修剪草坪。 – Jacob

回答

0

第二個選項是速度更快,也更具可讀性,但最好使用一些其他的名字不是「臨時」

2

第二個版本是微小的一點點更快。

原因:
2方法調用較少(如果它不以'a'結尾)。
但兩者並不遠不止return variable;

  • charAt()只有一個陣列的存取,並
  • 字符串的length()已經預先計算爲好。
1

由於str_final.charAt(str_final.length()-1)在最壞的情況下也會執行一次,所以第二個代碼更好。

char temp = str_final.charAt(str_final.length() -1); 

if(temp == 'a' || temp == 'b') 
{ 
    // body 
} 

在其他情況下str_final.charAt(str_final.length()-1)必須被執行兩次。

0

第二段代碼更快,因爲.charAt.length()僅評估一次。正如其他人指出的那樣,可讀性顯然更重要,但也有利於第二種解決方案。

+0

我很好奇,通過兩次調用'charAt'和'length'來找出HotSpot發出的機器代碼是什麼...... –

+0

好問題,雖然... –

0

這是一個疑問嗎?我當然會更喜歡第二個構造,因爲它更可讀,可能表現更好。

編譯器可以輕鬆地優化臨時變量,但無法確定函數調用是否有副作用。所以雙函數調用不能優化爲單個調用。

1

它可能與性能相同,因爲優化編譯器(或只是及時編譯器/熱點)可能會在編譯時將第一版本更改爲第二版本。

+1

這是真的。即使不這樣做,下一代編譯器也可能會這樣做。 –

0

第二個不能慢,所以我想我會說第二個,因爲它至少避免了一個方法調用。但是,JIT將會內聯這一點。性能差異將幾乎可以忽略不計,除非這是一個非常緊密的循環。

我個人找到更具可讀性,以及(也許如果你不同於「臨時」其他變量的東西)。所以我會爲此投票。但是我認爲這是更好的問題:哪一個更清楚?如果您有任何理由相信這是代碼問題,請關注性能。

1

我會去第二個選項,因爲它更容易閱讀。另外str_final.length()str_final.charAt()只被調用一次。

此外,不要調用字符temp,而應將其稱爲更有意義的東西,如lastChar

,如果你有不只是兩個角色更要檢查你甚至可以考慮使用switch語句:

char lastChar = str_final.charAt(str_final.length() -1); 
switch (lastChar) { 
    case 'a': 
    case 'b': 
    //do something 
    break; 
    case 'c': 
    //something else 
    break; 
    case 'd': 
    //something else 
    break; 
} 
+0

顯然我會叫它last_char,但就在這裏我的名字是這樣的...對不起:) – Vins

+0

在Java中,約定是使用camelCase – dogbane

0

第二個版本更好,雖然它具有比第一微小的性能外,還具有兩個優點 1.可讀性 2.維護 - 對於這種類型的代碼,假設如果你要檢查多個條件(說10),然後改變邏輯,只是一個地方。