2012-07-05 101 views
4

我想知道是否嵌套如果比AND語句更好。我有一個循環執行了很多次,所以我正在考慮更快的執行。以下是與我的代碼具有相同邏輯的代碼。嵌套的if語句在循環中。替換嵌套如果語句與AND

for (int i = 0; i < array.length; i++) 
    { 
     // do stuff 
     if (x == 5) 
     { 
     if (y == 3) 
     { 
      // do stuff 
     } 
     } 
    } 

如果我用這個和STATEMENT替換嵌套的if,我的代碼會因爲顯着差異而加快嗎?

 if ((x == 5) && (y == 3)) 
      // do stuff 

我已閱讀本link但我沒有找到答案。我是一名學生,仍在學習,感謝所有的反饋!

回答

3

.NET會停止,如果第一部分檢查時,首先想到做無效支票的條件是錯誤的,所以兩者之間沒有性能差異。

+0

邏輯是否也發生在AND語句中? – blenzcoffee 2012-07-05 19:34:19

+0

這就是我的意思。在和聲明中,如果前半部分是錯誤的,它不會在下半場檢查。 – Tyrsius 2012-07-05 19:35:00

+1

這就是所謂的短路,所有邏輯運算符儘可能短路,這意味着如果他們知道結果*必須*爲真/假,他們立即停止執行任何其他語句,因爲它們不會影響結果。 – Servy 2012-07-05 19:36:33

9

不,它在性能上沒有顯着差異,可能存在可讀性差異。

IL_0000: ldc.i4.5  
IL_0001: stloc.0  
IL_0002: ldc.i4.s 0A 
IL_0004: stloc.1  
IL_0005: ldloc.0  
IL_0006: ldc.i4.5  
IL_0007: bne.un.s IL_000D 
IL_0009: ldloc.1  
IL_000A: ldc.i4.3  
IL_000B: pop   

即使沒有優化的差距並不顯著:

嵌套聲明:

時優化/釋放(與LINQPad測試)編譯的這兩項都會產生相同的IL

IL_0001: ldc.i4.5  
IL_0002: stloc.0  
IL_0003: ldc.i4.s 0A 
IL_0005: stloc.1  
IL_0006: ldloc.0  
IL_0007: ldc.i4.5  
IL_0008: ceq   
IL_000A: ldc.i4.0  
IL_000B: ceq   
IL_000D: stloc.2  
IL_000E: ldloc.2  
IL_000F: brtrue.s IL_0020 
IL_0011: nop   
IL_0012: ldloc.1  
IL_0013: ldc.i4.3  
IL_0014: ceq   
IL_0016: ldc.i4.0  
IL_0017: ceq   
IL_0019: stloc.2  
IL_001A: ldloc.2  
IL_001B: brtrue.s IL_001F 
IL_001D: nop   
IL_001E: nop 

未嵌套stat對此語句:

IL_0001: ldc.i4.5  
IL_0002: stloc.0  
IL_0003: ldc.i4.s 0A 
IL_0005: stloc.1  
IL_0006: ldloc.0  
IL_0007: ldc.i4.5  
IL_0008: bne.un.s IL_0013 
IL_000A: ldloc.1  
IL_000B: ldc.i4.3  
IL_000C: ceq   
IL_000E: ldc.i4.0  
IL_000F: ceq   
IL_0011: br.s  IL_0014 
IL_0013: ldc.i4.1  
IL_0014: nop   
IL_0015: stloc.2  
IL_0016: ldloc.2  
IL_0017: brtrue.s IL_001B 
IL_0019: nop 
+1

「但在可讀性上」? :) – Almo 2012-07-05 19:29:26

+0

@Almo,當你不需要的時候嵌套if語句會導致everythign的可讀性較差,但這是主觀的(也許):) – 2012-07-05 19:30:01

+2

我同意你的觀點,但是「可讀性」沒有任何意義。這很諷刺,因爲它評論可讀性,而且本身不可讀。 :) – Almo 2012-07-05 19:30:56

3

不,不會有任何兩者之間的區別。然而,並使行較少,更可讀的(如果你沒有那麼多的條件)

在有些情況下if s爲更好,感覺更自然的情況下,一個常見的例子是:

String s=//... 
if(s==null)return; 
if(s.Length > 0) //do something 

if ((s!=null) && (s.Length > 0)) //Dosomething 

許多開發商做這樣的錯誤:

if ((s.Length > 0) && (s!=null)) //Dosomething 

隨着AND,這可以被替換

將在一個空引用異常

結束正如你所看到的,它是更自然的使用單獨if小號

+0

有時它甚至更好地使用XOR - 但它不可重寫... – Jasper 2012-07-05 19:30:52

+0

真:)但可讀性優先 – GETah 2012-07-05 19:36:20

1

在編譯代碼中,沒有理由說速度應該不同,它們會轉換成完全相同的彙編代碼。我完全同意可讀性因素,它也會縮短班級的長度。