2017-03-16 86 views
4

我們使用switch語句根據一系列條件對一個對象執行一些處理,並且默認情況下我們期望針對所有情況進行調用。開關語句性能C#

我們對解決此問題的最佳方式存在分歧。

我們中有些人喜歡例子答:

switch (task) 
{ 
    case A: 
     ProcessA(); 
     goto default; 
    case B: 
     ProcessB(); 
     goto default; 
    case C: 
     ProcessC(); 
     goto default; 
    default: 
     Final(); 
} 

而另一些建議,最好使用像例如B:

switch (task) 
{ 
    case A: 
     ProcessA(); 
     break; 
    case B: 
     ProcessB(); 
     break; 
    case C: 
     ProcessC(); 
     break; 
} 

Final(); 

由於Final()將在所有情況下,無論如何調用。

這是個人偏好的情況,還是存在客觀的性能差異。

我們應該注意哪些準則或疑難問題?

這是用C#編寫的API,並且會被頻繁調用。我們熱衷於做對!

乾杯!

+9

我還沒有見過使用C#switch中的'goto'。 – xanatos

+2

我認爲第一個代碼甚至不應該被考慮在內。這不是交換機的默認設置。 –

+1

是的,這很古怪..我更喜歡第二種方式,當然。儘管'goto'關鍵字存在於C#中,我會遠離它,因爲它違背了像c#這樣的程序語言。另外,關於性能與風格的選擇:只有在性能問題成爲問題時才能解決性能問題。 –

回答

8

我會說堅持使用實例B.

有真的在手動插入代碼「跳」周圍沒有任何意義。特別是當你在所有情況下跳到同一個地方時。這是代碼塊的用途。示例B閱讀好得多,並且更容易遵循。

至於表現,我不確定哪個會更快(衡量它?)。但在這一點上,它看起來像你不應該關心的微型優化。在這個例子中,我會說可讀性和可維護性勝過你可能獲得的任何微小的性能增益。

+1

做了一些測試,並且在所有情況下IL和性能基本相同。由於這個答案中提到的原因,最終與B一起去。 –

-2

示例B是任何方面的最佳答案。

千萬不要使用goto。它會降低您的代碼的性能和可讀性。 CPU使用一些技術來預測未來的指令以防止性能下降。使用goto會擾亂這種技術,導致性能下降!

重複一段代碼會增加程序的二進制大小。所以在所有情況下重複Final()都會增加代碼的二進制大小,這並不令人愉快。