2012-03-16 11 views
16

Eventuali duplicati:
String comparison in dotnet framework 4prestazioni di String.IndexOf OrdinalIgnoreCase vs CurrentCultureIgnoreCase

ho notato un problema di prestazioni sulla mia macchina in un'applicazione utente che sta facendo un sacco di confronti di stringhe da fare filtraggio di grandi liste. Ho rintracciato il problema nell'utilizzo di OrdinalIgnoreCase in una chiamata a string.IndexOf. I seguenti benchmark sono stati eseguiti in Release senza il debugger allegato, si tratta di un progetto 4.0 costruito in VS 2010, Windows 7, ho la versione beta 4.5 installata su questa macchina, non sono sicuro che ciò influirebbe su questo.

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 

Come si può vedere, OrdinalIgnoreCase è più lungo di 6,5 volte più lento! Ma senza IgnoreCase Ordinal è il più veloce. In multiple places microsoft recommends OrdinalIgnoreCase per la migliore prestazione. Qualcuno può replicare questi risultati o spiegare perché OrdinalIgnoreCase sta andando molto più lentamente in questo test?

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

ho idea, ma hai provato randomizing l'ordine di prova per garantire che qualcos'altro non è la causa il ritardo nel tuo apparecchio di prova? –

+0

Ok, ci ho provato. Non il problema –

+0

Utilizzando .NET 3.5, i benchmark sono relativamente coerenti. Targeting 4.0, vedo lo stesso di sopra. –

risposta

8

Questo è apparentemente un problema di prestazioni noto in .net 4, ho trovato this bug entry on connect.microsoft.com

e non v'è una risposta

Pubblicato da Microsoft il 2012/02/10 alle 11:43 AM Siamo stati in grado di riprodurre questo problema. Il problema è stato risolto e la correzione sarà nella prossima release di . Grazie per il tuo feedback.

Non sono sicuro di quello che la prossima versione sarà, mi limiterò a preferire usando InvariantCultureIgnoreCase invece

+2

La prossima versione sarà .Net 4.5, che esce con VS 11. Ma non ho idea di quando sarà o se risolverà questo bug. – svick