2013-06-21 39 views
3

我試圖找出if語句的一些最佳做法。當我需要打開一些等式時,即需要一個if-else結構時,我通常在「不等於」上寫入條件。這背後的原因是通常,當一個不成功的結果出現時,指令的數量以及它們的複雜度都很低。比較過程有什麼不同嗎?等於(==)和不等於(!=)之間的執行時間有差異嗎?C#執行速度:等於(==)與不等於(!=)

例(一個相當簡單的,但一般的概念持有):

string myString = "weekend"; 
if(myString != "weekend") 
{ 
    Console.WriteLine("No fun...!"); 
} 
else 
{ 
    //do a bunch of fun stuff with relatively high complexity 
    //can expand over many lines of code 
} 

是否有執行時間有什麼區別,如果我改變的if-else語句的順序?

string myString = "weekend"; 
if(myString == "weekend") 
{   
    //do a bunch of fun stuff with relatively high complexity 
    //can expand over many lines of code 
} 
else 
{ 
    Console.WriteLine("No fun...!"); 
} 
+0

嘗試對其進行基準測試。我相信你會發現在性能方面''=''僅僅是'=='的翻轉(所以它並不重要)。 – Romoku

+1

轉到可讀性。修復之後的性能問題,這可能不是一個問題。 – Arran

+1

[只需對它進行基準測試!](http://ericlippert.com/2012/12/17/performance-rant/) –

回答

10

我會說你應該把它寫得最可讀。這樣的微觀優化根本不會對您的代碼產生任何可辨別的差異:您最多隻需要單個「不」操作。如果這是一個顯着的差異,那麼編譯器可能會優化它,但實際上這是沒有什麼可以考慮的。

1

在普通的處理器,跳躍,如果平等和跳躍-IF-不等於說明在內存和速度方面非常相似。這是假設編譯器不會優化語法的差異。

1

我建議將高複雜性邏輯轉換爲單獨的方法,從而抽象出邏輯並簡化您的方法。

string myString = "weekend"; 
if(myString == "weekend") 
{   
    ComplexMethod(); 
} 
else 
{ 
    Console.WriteLine("No fun...!"); 
} 

這樣,你寫if語句的方式無關緊要。


在性能方面,我不認爲你會發現==!=之間的任何顯著的差異。

+1

好的答案,側重於代碼結構而不是(過度)優化。 –

0

因爲沒有真正的性能差異(它只會真的很重要,如果你是在一個非常非常嚴格的循環),我強烈建議不要「標準化」==或!=,而只是與這種情況是有道理的。

我通常先把小殼放在第一位,否則最後會出現很多掛鉤。

例如

if (number != 1337) 
{ 
    Console.Writeline("Nope") 
} 
else 
{ 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
} 

,而不是

if (number == 1337) 
{ 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
    // Do lots of stuff 
} 
else 
{ 
    Console.Writeline("Nope") 
} 

有些人喜歡先放行爲,以及邊緣案件後(說,它更像是嘗試{}趕上{}) - 所以它更是一個事的風格而不是最佳實踐。

如果做很多東西被笨拙,那麼你可能要考慮的功能,這意味着它並不重要,你把什麼樣的順序項目

if (number == 1337) 
{ 
    DoLotsOfStuff(); 
} 
else 
{ 
    Console.Writeline("Nope") 
} 
1

只要想到我會包裹是我的說....

如果這段代碼已經在它自己的函數中,我只是執行檢查,然後返回,如果我不想執行其餘的代碼。事情是這樣的:

void PointlessExample(){ 
    string myString = "weekend"; 
    if(myString != "weekend") 
    { 
     Console.WriteLine("No fun...!"); 
     return; 
    } 

    //rest of the code 
} 
12

首先,對方回答這不能不(1)擔心一些事情,(2)編寫的代碼看起來最好的方式,和(3)如果你真的關心,測量它,是正確的。

所有人都說,認識到允許編譯器以任何方式生成代碼是很重要的,只要意義被保留,編譯器就會頻繁更改if中布爾的「符號」以便它們可以生成更好的代碼。請記住,當編譯器將C#轉換爲IL時,抖動將IL轉換爲機器碼,則不會有if語句。在IL中只有「在堆棧上生成一個布爾值;現在如果布爾值爲真/假,則跳轉」,或者在機器碼中「如果寄存器爲零/非零,則立即跳轉到寄存器中;現在跳轉。

當你說:

if (A()) 
    B(); 
C(); 

編譯器可能會產生這些指令相當於:

call A() 
if last result is false then goto SKIP 
call B() 
SKIP: call C() 

或者,它可以很容易地產生:

call A() 
if last result is true then goto CONSEQUENCE 
goto SKIP 
CONSEQUENCE: call B() 
SKIP: call C() 

注意,第一個版本反轉了測試的符號,比第二個版本短一條版本,因此更可能由優化編譯器生成,該編譯器試圖縮短代碼。

本着這種精神,編譯器可以選擇比較相等而不是不等式,並且在測試的符號反轉時產生更好的代碼。再次類似地,C#編譯器有時會將if (A() <= B())轉換爲if (!(A() > B()),反之亦然,這樣做不會改變程序的含義,並且一個版本比另一個版本短。

我的觀點是,從等式變爲不等式在生成的代碼中可能根本沒有任何區別,因爲編譯器會自動將代碼重寫爲更好的版本。請相信編譯器完成工作,並擔心其他問題。

+0

編譯器是否允許爲用戶定義的運算符重載進行優化?沒有什麼能夠阻止愚蠢的程序員使用==和!=的非對稱重載,這意味着這樣的優化會改變程序的輸出。 – Brian

+3

@Brian:你好像在那裏很好地回答了你自己的問題。 –

+0

這應該是被接受的答案,因爲它詳細介紹了在微優化上信任編譯器。 –