2014-04-29 31 views
4

我在Java開發人員的第一份工作中總是被教導,以避免使用「!=」,而是使用空if子句,然後將邏輯放在else :Java不等於(!=)性能差異

//Bad: 
if (x != null) { 
    // logic 
} 

//Good: 
if (x == null){ 
} else { 
    // logic 
} 

我們的首席開發者的理由是爲了避免不必要的位開關特別適用於簡單的邏輯類似空檢查。

我一直在尋找來源,說明這一點,但我似乎無法找到任何。 if if子句練習真的是「最佳練習」還是僅僅是一種偏好?

+10

我不知道是誰教你使用一個空的if條款,但這是廢話。它所做的只是使代碼難以維護。 (爲什麼這個條款是空的 - 是否應該去這裏?)當然沒有性能差異。 –

+0

您的性能收益如何失去可維護性和/或可讀性? – Keugyeol

+0

你的首席開發人員...並不是很有前途。我懷疑更多的貨物邪教。 –

回答

10

IMO,這是一個失敗的微優化嘗試。

編譯代碼

public static void main(String... args) { 
    Object x = null; 
    //Bad: 
    if (x != null) { 
     // logic 
    } 

    //Good: 
    if (x == null){ 
    } else { 
     // logic 
    } 
} 

javap

public static void main(java.lang.String...) 
    descriptor: ([Ljava/lang/String;)V 
    flags: ACC_PUBLIC, ACC_STATIC, ACC_VARARGS 
    Code: 
     stack=1, locals=2, args_size=1 
     0: aconst_null 
     1: astore_1 
     2: aload_1 
     3: ifnull  6 
     6: aload_1 
     7: ifnonnull  10 
     10: return 
     LineNumberTable: 
     line 9: 0 
     line 11: 2 
     line 16: 6 
     line 20: 10 

    } 

Both have a jump to another branch.在性能上沒有什麼不同檢查。國際海事組織,雖然你的代碼的可讀性受到影響。

如果x爲空,則爲blah,否則爲邏輯。

+0

這裏的關鍵是這兩個測試都是通過一個JVM指令來實現的:對於''=''情況''ifnull',對'=='情況''ifnonnull'。字節碼中沒有「位開關」步驟。而且,由於CPU爲正負條件跳轉(例如x86上的JZ/JNZ)提供了機器指令,所以一個體面的JIT應該能夠避免在機器代碼中執行「位開關」。 – Wyzard

+1

(如果對'!='情況使用'ifnull',反之亦然似乎是違反直覺的,btw,請記住字節碼正在測試是否跳過* if'body而不執行它。 – Wyzard