2011-12-16 77 views
3

假設有像要知道交換機的性能C#

static string switchExample(string abc){ 
    switch(abc.ToUpper()) { 
     case "123": 
      return "Numeric"; 
     case "ab": 
      return "Alphabets"; 
     default: 
      return "symbol"; 
    } 
} 

現在,這裏的一些方法的開關,我需要知道的是沒有使用出口(在每種情況下的回報)的多點像我的任何性能問題在給定的代碼中做了,而不是在一開始就通過創建一些臨時字符串並填充相應的大小寫匹配來傳遞更新的值。

+0

在我看來,您可以更快地返回,並且使用的變量/內存量最少/更快。 – 2011-12-16 04:50:55

+3

我認爲更大的性能打擊將來自切換字符串。如果你關心性能(每條指令都在計數),切換到一個int或一個枚舉。 – 2011-12-16 04:53:20

回答

3

現在,這裏我需要沒有在那裏使用多個 點退出

你的問題是過早優化的縮影任何性能問題。

我的建議如果你真的想知道的話,就是用兩種方法寫出這個方法 - 一次用return陳述在每種情況下和一次在switch陳述後用單一返回。然後反編譯每個中間語言進行比較。

如果不通過性能分析進行實際測量,您仍然無法對性能做出任何特定聲明。

但是,我認爲可以肯定的是,如果有任何差異,那麼將會極其微乎其微。最終的結果應該不過是將該值與常量字符串進行比較,並在匹配時將值和堆棧進行匹配並返回。編譯器可能會優化分配給臨時變量,看到它只會被用作返回值。

此外,一些開關語句由編譯器進行了顯着優化。有關switch語句性能和優化的更多信息,請參閱https://stackoverflow.com/a/395965/224087https://stackoverflow.com/a/126507/224087

您對這些性能的質疑只會是一小部分或者兩項CPU操作 - 真正需要關注的很少的時間。

4

使用Visual Studio 11 Developer Preview進行測試表明,如果您的switch語句少於7個案例(6個案例和默認值),則編譯器會生成一系列if語句。您的示例代碼被轉換爲等價的:

string s = abc.ToLower(); 
if (s == "123") return "Numeric"; 
if (s == "ab") return "Alphabetic"; 
return "symbol"; 

如果有7個或更多的情況下,編譯器生成一個創建字典碼,映射到串連續整數。然後它使用IL switch語句(類似於其他語言中計算的goto)來根據值分支到不同的代碼。

代碼的生成使得字典只創建一次 - 第一次執行switch語句。該switch語句的後續使用不必重新創建字典。

就效率而言,爲小型switch語句生成的編譯器代碼等效於多個if語句。當有6個以上的情況(包括缺省值)時,編譯器的字典查找將比多個switch語句更快。

請注意,我的數字是基於一個非常小的樣本(少數測試)使用未發佈的編譯器版本的開發人員預覽。以前版本的編譯器可能具有不同的閾值,或者可能使用其他方法,新編譯器的最終發行版本可能會做與上述不同的操作。我不會指望任何這些實現​​細節。

總之,寫出switch。讓編譯器擔心如何使其更快。