Строка. Содержит () быстрее, чем Строка. IndexOf ()?

Вы можете попробовать что-то вроде этого ..

.a {
  font-family: "Itim", cursive;
  position: absolute;
  top: 10px;
  left: 10px;
  z-index: 1;
}
.b {
  font-family: "Sedgwick Ave", cursive;
  position: absolute;
  top: 10px;
  left: 10px;
}
110
задан Kb. 25 April 2014 в 16:36
поделиться

8 ответов

Contains вызовы IndexOf:

public bool Contains(string value)
{
    return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

, Который звонит CompareInfo.IndexOf, который в конечном счете использует реализацию CLR.

, Если Вы хотите видеть, как строки сравнены в CLR , который это покажет Вам (ищут CaseInsensitiveCompHelper).

IndexOf(string) не имеет никаких опций и Contains() использование, которое сравнивает Ординал (сравнение байта байтом вместо того, чтобы пытаться работать, умное выдерживают сравнение, например, e с Г©).

Так IndexOf будет незначительно быстрее (в теории), поскольку IndexOf переходит прямо к использованию поиска строки FindNLSString из kernel32.dll (питание отражателя!).

Обновленный для.NET 4.0 - IndexOf больше не использует Порядковое Сравнение и так Содержит, может быть быстрее. См. комментарий ниже.

167
ответ дан ProVega 24 November 2019 в 03:13
поделиться

Содержит (s2), много раз (в моем компьютере 10 раз) быстрее, чем IndexOf (s2), потому что Содержит, использует StringComparison. Порядковый, который быстрее, чем культура чувствительный поиск, который IndexOf делает по умолчанию (но это может измениться в .net 4.0 http://davesbox.com/archive/2008/11/12/breaking-changes-to-the-string-class.aspx ).

Содержит, имеет точно то же представление в качестве IndexOf (s2, StringComparison. Порядковый)> = 0 в моих тестах, но это короче и ясно дает понять Ваше намерение.

11
ответ дан ggf31416 24 November 2019 в 03:13
поделиться

Вероятно, это не будет иметь значения вообще. Читайте это сообщение при Кодировании Ужаса ;): http://www.codinghorror.com/blog/archives/001218.html

20
ответ дан Gonzalo Quero 24 November 2019 в 03:13
поделиться

Если Вы действительно хотите к микро, оптимизируют Ваш код, которого всегда сравнивает Ваш лучший подход.

платформа .NET имеет превосходную реализацию секундомера - Система. Диагностика. Секундомер

6
ответ дан Rui Jarimba 24 November 2019 в 03:13
поделиться

При помощи Отражателя Вы видите, это Содержит, реализован с помощью IndexOf. Вот реализация.

public bool Contains(string value)
{
   return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

Так Содержит, вероятно крошечный бит медленнее, чем вызов IndexOf непосредственно, но я сомневаюсь, что он будет иметь любое значение для фактической производительности.

6
ответ дан Brian Rasmussen 24 November 2019 в 03:13
поделиться

От небольшого чтения кажется это под капотом Строка. Содержит метод, просто называет Строку. IndexOf. Различием является Строка. Содержит возвращает булевскую переменную в то время как Строка. IndexOf возвращает целое число с (-1) представление, которым не была найдена подстрока.

я предложил бы писать немного теста приблизительно с 100,000 повторений и лично убедился бы. Если бы я должен был предположить, то я сказал бы, что IndexOf может быть немного быстрее, но как я сказал это просто предположение.

у Jeff Atwood есть хорошая статья о строках в его блог . Это больше о конкатенации, но может быть полезно, тем не менее.

3
ответ дан Mike Roosa 24 November 2019 в 03:13
поделиться

Пользуйтесь библиотекой сравнительного теста, как этот недавний набег от Jon Skeet для измерения его.

Принцип "качество на риск покупателя"

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

Как все (микро-) вопросы о производительности, первый шаг должен быть должен получить рабочую версию, которая легко удобна в сопровождении. Затем сравнительное тестирование, профилирование и настройка могут быть применены к измеренным узким местам вместо предположения.

2
ответ дан Doorknob 24 November 2019 в 03:13
поделиться

Так же, как обновление к этому, я провел некоторое тестирование и предоставил вам довольно большую входную строку, тогда параллельное Regex - это самый быстрый метод C #, который я нашел (при условии, что у вас более одного ядра, как мне кажется)

Например, получение общего количества совпадений -

needles.AsParallel ( ).Sum ( l => Regex.IsMatch ( haystack , Regex.Escape ( l ) ) ? 1 : 0 );

Надеюсь, это поможет!

3
ответ дан 24 November 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: