可能是重复问题:
dotnet framework 4中的字符串比较
我在一个UI应用程序中发现了性能问题,该应用程序需要对大量列表进行字符串比较来进行过滤。我将问题追溯到使用OrdinalIgnoreCase调用string.IndexOf。以下基准测试是在Release模式下运行的,未连接调试器,它是使用VS 2010构建的4.0项目,在Windows 7上运行。我在这台机器上安装了4.5 beta版本,不确定是否会影响此问题。
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是最快的。在多个地方,微软建议使用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);
}