Как быстрее найти один символ в строке? - PullRequest
2 голосов
/ 27 мая 2010

Что из этого кода быстрее / эффективнее? :

Boolean contains = myString.IndexOf("~", StringComparision.InvariantCultureIgnoreCase)!=-1;

или

Boolean contains = myString.IndexOf('~')!=-1;

Я думаю, что второй, потому что это одиночный символ, но использование инвариантной культуры игнорировать регистр регистра тоже должно быть быстрым: P

Приветствие.

Ответы [ 6 ]

3 голосов
/ 27 мая 2010

Инвариантная культура быстрее, чем другие культуры, но порядковое сравнение еще быстрее. Делать это безразлично медленнее для этих настроек. Таким образом, самый быстрый параметр сравнения строк - StringComparison.Ordinal.

Поиск символа примерно в два раза быстрее, чем поиск самой быстрой строки.

2 голосов
/ 27 мая 2010

два фрагмента не эквивалентны, используйте в зависимости от того, что правильно. если у вас есть проблемы с производительностью профиля.

2 голосов
/ 27 мая 2010

Второй намного быстрее. На моей машине первое время занимает около 340 мс, а второе - 34 мс. Так 10 раз.

Интересно, что использование InvariantCulture в отличие от InvariantCultureIgnoreCase быстрее, и, как отметил Гуффа, Oridinal еще быстрее. Но не так быстро, как IndexOf (char).

static void Main(string[] args)
    {
        string myString = "qwertyuipasdfghjklzxcvbnm,.~";

        var s = Stopwatch.StartNew();

        for (int i = 0; i < 1000000; i++)
        {
            Boolean contains = myString.IndexOf("~", StringComparison.InvariantCultureIgnoreCase) != -1;
        }

        s.Stop();
        Console.WriteLine(s.ElapsedMilliseconds);

        var s2 = Stopwatch.StartNew();

        for (int i = 0; i < 1000000; i++)
        {
            Boolean contains = myString.IndexOf('~') != -1;
        }

        s2.Stop();
        Console.WriteLine(s2.ElapsedMilliseconds);
        Console.ReadLine();

    }
1 голос
/ 27 мая 2010

Как бы то ни было, перегрузка IndexOf(char) будет значительно быстрее, но вы, вероятно, не заметите, если не проведете десятки тысяч к миллионам этих сравнений.

Вы должны использовать любую перегрузку, наиболее подходящую для того, что вы на самом деле пытаетесь сделать.

Если вам необходимо сравнение с учетом культурных особенностей и / или регистронезависимое сравнение, тогда используйте соответствующую опцию IndexOf перегрузка и StringComparison. В этой ситуации, когда вы просто ищете символ ~, имеет смысл просто использовать IndexOf('~').

1 голос
/ 27 мая 2010

Вы также можете посмотреть здесь Оптимизация строковых операций в C # , может быть, это также даст вам некоторые идеи о том, как вы можете оптимизировать его для ваших нужд.

1 голос
/ 27 мая 2010

Напишите свой собственный микробенчмарк.Время выполнения 100000 раз каждого из них.Это должно дать вам ответ.

...