Производительность string.IndexOf OrdinalIgnoreCase vs CurrentCultureIgnoreCase - программирование
Подтвердить что ты не робот

Производительность string.IndexOf OrdinalIgnoreCase vs CurrentCultureIgnoreCase

Возможный дубликат:
Сравнение строк в платформе dotnet 4

Я заметил проблему с производительностью на моем компьютере в приложении пользовательского интерфейса, которое проводит множество сравнений строк, чтобы фильтровать большие списки. Я отследил проблему до использования OrdinalIgnoreCase в вызове string.IndexOf. Следующие тесты были запущены в Release без отладочного приложения, это проект 4.0, построенный в VS 2010, Windows 7, у меня есть бета-версия 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

Как вы можете видеть, OrdinalIgnoreCase более 6.5x медленнее! Но без 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);
}
4b9b3361

Ответ 1

Это, по-видимому, известная проблема с производительностью в .net 4, я нашел эту ошибку на сайте connect.microsoft.com

И есть ответ

Отправлено Microsoft от 10.02.2012 в 11:43. Мы смогли воспроизвести Эта проблема. Проблема решена, и исправление будет в следующий выпуск. Благодарим вас за отзыв.

Я не уверен, что будет в следующей версии, я просто предпочту использовать InvariantCultureIgnoreCase вместо