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);
}
Nie mam pojęcia, ale próbowałeś losowanie kolejności badania, czy coś innego nie powoduje opóźnienie w twoim urządzeniu testowym? –
Ok, właśnie tego wypróbowałem. Nie problem. –
Przy użyciu środowiska .NET 3.5 testy porównawcze są stosunkowo spójne. Kierowanie na 4.0, widzę to samo, co powyżej. –