string.IndexOf OrdinalIgnoreCase与CurrentCultureIgnoreCase的性能

Bra*_*AGr 16 c# string performance

可能重复:
dotnet框架中的字符串比较4

我注意到我的机器上的一个性能问题在UI应用程序中进行了大量的字符串比较,以便对大型列表进行过滤.我在调用string.IndexOf时跟踪问题直到使用OrdinalIgnoreCase.以下基准测试是在未附带调试器的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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,OrdinalIgnoreCase慢了6.5倍!但没有IgnoreCase Ordinal是最快的.在多个地方,microsoft建议使用 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);
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*AGr 9

这显然是.net 4中已知的性能问题,我在connect.microsoft.com上发现了这个错误条目

并且有回应

微软发表于2012年2月10日上午11:43我们能够重现这个问题.该问题已得到解决,修复程序将在下一个版本中发布.谢谢你的反馈.

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

  • 下一个版本将是.Net 4.5,它与VS 11一起发布.但是我不知道它将会是什么时候或它是否会修复这个bug. (2认同)