字符串的性能:OrdinalIgnoreCase与CurrentCultureIgnoreCase下的string.IndexOf比较

18

可能是重复问题:
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);
}

1
我不确定,但你是否尝试过随机化测试顺序以确保其他因素没有导致测试装置的延迟? - Ritch Melton
好的,刚试了一下。不是那个问题。 - Ritch Melton
使用 .NET 3.5,基准测试结果相对稳定。针对 4.0,我看到与上述相同的情况。 - Adam S
1个回答

9
这显然是.net 4中已知的性能问题,我在connect.microsoft.com上找到了这个错误条目
还有一个回应:

Microsoft于2012年2月10日11:43 AM发布。我们能够复制此问题。该问题已得到解决,并且修复将在下一个版本中发布。感谢您的反馈。

我不确定下一个版本会是什么,我只想使用InvariantCultureIgnoreCase。

2
下一个发布版本将是 .Net 4.5,它将与 VS 11 一起发布。但我不知道那会是什么时候,也不知道它是否会修复这个 bug。 - svick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接