2012-03-16 15 views
16

Powiel możliwe:
String comparison in dotnet framework 4Wydajność String.indexOf OrdinalIgnoreCase vs CurrentCultureIgnoreCase

zauważyłem problem z wydajnością na moim komputerze w app UI, że robi wiele porównań łańcuchowych do zrobienia filtrowanie dużych list. Śledziłem problem do używania OrdinalIgnoreCase w wywołaniu string.IndexOf. Następujące testy zostały uruchomione w wersji bez dołączonego debuggera, jest to projekt 4.0 zbudowany w VS 2010, Windows 7, mam zainstalowany 4.5 beta na tym komputerze, nie jestem pewien, czy to wpłynęłoby na to.

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 

Jak widać ZwykłaIgnoreCase jest ponad 6,5x wolniejsza! Ale bez IgnoreCase Ordinal jest najszybszy. W multiple places microsoft recommends OrdinalIgnoreCase dla najlepszej wydajności. Czy ktoś może powtórzyć te wyniki lub wyjaśnić, dlaczego OrdinalIgnoreCase idzie o wiele wolniej w tym teście?

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

Nie mam pojęcia, ale próbowałeś losowanie kolejności badania, czy coś innego nie powoduje opóźnienie w twoim urządzeniu testowym? –

+0

Ok, właśnie tego wypróbowałem. Nie problem. –

+0

Przy użyciu środowiska .NET 3.5 testy porównawcze są stosunkowo spójne. Kierowanie na 4.0, widzę to samo, co powyżej. –

Odpowiedz

8

To widocznie znany problem wydajność w .NET 4, znalazłem this bug entry on connect.microsoft.com

I jest odpowiedzią

Wysłany przez Microsoft w dniu 2/10/2012 o 11:43 AM Mogliśmy repro ten problem. Problem został rozwiązany, a poprawka pojawi się w następnym wydaniu . Dziękuję za opinie.

Nie jestem pewien, co następne wydanie będzie, będę po prostu wolą używać InvariantCultureIgnoreCase zamiast

+2

Następnym wydaniem będzie .Net 4.5, który wychodzi z VS 11. Ale nie mam pojęcia kiedy to nastąpi i czy naprawi ten błąd. – svick

Powiązane problemy