C# OrdinalIgnoreCase与CurrentCultureIgnoreCase的string.IndexOf性能

C# OrdinalIgnoreCase与CurrentCultureIgnoreCase的string.IndexOf性能,c#,string,performance,C#,String,Performance,可能重复: 我注意到我的机器在一个UI应用程序中出现了一个性能问题,该应用程序正在进行大量字符串比较,以过滤大型列表。我在对string.IndexOf的调用中使用OrdinalIgnoreCase解决了这个问题。以下基准测试是在没有附加调试器的版本中运行的,它是在VS 2010、windows 7中构建的4.0项目,我确实在这台机器上安装了4.5测试版,我不确定这是否会影响这一点 1.190 seconds for OrdinalIgnoreCase 0.178 seconds for Cu

可能重复:

我注意到我的机器在一个UI应用程序中出现了一个性能问题,该应用程序正在进行大量字符串比较,以过滤大型列表。我在对string.IndexOf的调用中使用OrdinalIgnoreCase解决了这个问题。以下基准测试是在没有附加调试器的版本中运行的,它是在VS 2010、windows 7中构建的4.0项目,我确实在这台机器上安装了4.5测试版,我不确定这是否会影响这一点

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
正如您所看到的,OrdinalingOrecase的速度慢了6.5倍以上!但如果没有忽略,序数是最快的。通常情况下,为了获得最佳性能。有谁能复制这些结果,或者解释为什么OrdinalingOrecase在这个测试中会慢得多

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);
}
私有静态无效测试(字符串搜索、字符串键、字符串比较、int试验)
{
var sw=Stopwatch.StartNew();
对于(int i=0;i
我发现,这显然是.NET4中已知的性能问题

这是一个回应

由微软于2012年2月10日上午11:43发布,我们能够重新 这个问题。问题已解决,修复程序将在 下一版本。感谢您的反馈


我不确定下一个版本是什么,我更喜欢使用InvariantCultureInogoreCase,而不是

我不知道,但是您是否尝试过随机测试顺序,以确保其他东西不会导致测试夹具中的延迟?好的,只是尝试了一下。不是问题。使用.NET3.5,基准比较一致。针对4.0,我看到了与上面相同的内容。下一个版本将是.NET4.5,它将与VS11一起发布。但我不知道什么时候会这样,也不知道它是否能修复这个bug。