2012-03-16 26 views
16

可能重複:
String comparison in dotnet framework 4性能string.IndexOf OrdinalIgnoreCase的VS CurrentCultureIgnoreCase

我注意到在UI應用程序在我的機器上的性能問題是做大量的字符串比較做的過濾大型列表。我將這個問題追蹤到在調用string.IndexOf時使用OrdinalIgnoreCase。下面的基準測試版在沒有附加調試器的情況下運行,它是VS 2010中建立的4.0項目,windows 7,我在這臺機器上安裝了4.5測試版,我不確定這是否會影響到這一點。

1.190 seconds for OrdinalIgnoreCase 
0.178 seconds for CurrentCultureIgnoreCase 
0.175 seconds for InvariantCultureIgnoreCase 

0.101 seconds for Ordinal 
0.132 seconds for CurrentCulture 
0.126 seconds for InvariantCulture 

1.176 seconds for OrdinalIgnoreCase 
0.189 seconds for CurrentCultureIgnoreCase 
0.183 seconds for InvariantCultureIgnoreCase 

0.104 seconds for Ordinal 
0.138 seconds for CurrentCulture 
0.127 seconds for InvariantCulture 

正如你所看到的OrdinalIgnoreCase的速度慢了6.5倍!但沒有IgnoreCase Ordinal是最快的。在multiple places microsoft recommends OrdinalIgnoreCase中獲得最佳性能。任何人都可以複製這些結果,或者解釋爲什麼OrdinalIgnoreCase在這個測試中會慢得多?

private static void Test(string search, string key, StringComparison comparison, int trials) 
{ 
    var sw = Stopwatch.StartNew(); 

    for (int i = 0; i < trials; i++) 
    { 
     search.IndexOf(key, comparison); 
    } 

    Console.WriteLine("{0:0.000} seconds for {1}", sw.ElapsedMilliseconds/1000.0, comparison); 
} 


static void Main(string[] args) 
{ 
    int trials = 1000000; 
    var search = Guid.NewGuid().ToString("N"); 
    var key = "34"; 

    Test(search, key, StringComparison.OrdinalIgnoreCase, trials); 
    Test(search, key, StringComparison.CurrentCultureIgnoreCase, trials); 
    Test(search, key, StringComparison.InvariantCultureIgnoreCase, trials); 
    Test(search, key, StringComparison.Ordinal, trials); 
    Test(search, key, StringComparison.CurrentCulture, trials); 
    Test(search, key, StringComparison.InvariantCulture, trials); 

    Test(search, key, StringComparison.OrdinalIgnoreCase, trials); 
    Test(search, key, StringComparison.CurrentCultureIgnoreCase, trials); 
    Test(search, key, StringComparison.InvariantCultureIgnoreCase, trials); 
    Test(search, key, StringComparison.Ordinal, trials); 
    Test(search, key, StringComparison.CurrentCulture, trials); 
    Test(search, key, StringComparison.InvariantCulture, trials); 
} 
+1

我不知道,但你嘗試過隨機測試,以確保別的東西不會導致你的測試夾具延遲了嗎? – 2012-03-16 01:39:13

+0

好的,只是試過。不是問題。 – 2012-03-16 01:41:56

+0

使用.NET 3.5,基準比較一致。針對4.0,我看到如上所述。 – 2012-03-16 02:35:51

回答

8

這顯然是在.NET 4中一個已知的性能問題,我發現this bug entry on connect.microsoft.com

而且還有一個響應

發佈Microsoft在2012年2月10日11:43上午我們能夠repro 這個問題。該問題已得到解決,修復將在 下一版本中發佈。感謝您的反饋。

我不知道下一個版本將是什麼,我只是更喜歡使用InvariantCultureIgnoreCase代替

+2

下一個版本將是.Net 4.5,與VS 11一起發佈。但是我不知道它將在什麼時候出現,或者它是否能解決這個錯誤。 – svick 2012-03-17 02:57:27