Когда следует использовать Regex поверх String.IndexOf ()? или String.Contains ()? - PullRequest
2 голосов
/ 01 июля 2010

Я сейчас работаю над своим первым проектом в .NET 4.0, и он требует нескольких тысяч сравнений строк (я ищу каталоги, а иногда и целые диски для определенных файлов).По большей части строки довольно короткие, потому что я смотрю только пути к файлам, поэтому я только что использовал String.Contains (), чтобы посмотреть, содержит ли строка пути к файлу мою строку иглы.было интересно, будет ли Regex лучшей идеей?В какой момент Regex будет быстрее, чем стандартное сравнение строк?Это основано на длине сравниваемых строк или количестве сравниваемых строк?

Ответы [ 4 ]

2 голосов
/ 01 июля 2010

Это переменная.Производительность сравнения представляет собой сложную функцию входных данных, культуры, используемой для сравнения, чувствительности к регистру и CompareOptions.Создание объекта Regex обходится дороже (если только он не находится в кеше Regex), поэтому, если вы делаете много разовых сравнений, его использовать не так уж и хорошо, и я обнаружил, что он обычно медленнее, чем IndexOf(), но YMMV.

Имейте в виду, что при использовании Contains / IndexOf культура, в которой работает пользователь / поток, будет определять способ сравнения.Это может оказать существенное влияние на производительность.Не все культуры такие быстрые.

Инвариантная культура - это очень быстрая культура.Если вы используете CompareInfo напрямую, а не String.IndexOf(), это будет еще быстрее.

CultureInfo.InvariantCulture.CompareInfo.IndexOf(..)

Единственный способ быть уверенным в правильности выбора - это тестирование.Тем не менее, если вы не перебираете много мегабайт строк, это не будет иметь значения, которое имеет значение для всех.Как сказал ранее ChrisF, в этом случае сконцентрируйтесь на читаемом / поддерживаемом коде.

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

2 голосов
/ 01 июля 2010

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

Если улучшения скорости - только незначительное пребывание с более читаемым, поддерживаемым кодом.

1 голос
/ 01 июля 2010

Я просто догадываюсь, но я подозреваю, что для простого поиска по подстроке будет небольшая разница в производительности между String.Contains(), String.IndexOf() и регулярным выражением (во всяком случае, я бы предположил, что регулярное выражение никогда не будет быстрее, номожет быть немного медленнее).

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

0 голосов
/ 01 июня 2011

В .Net 4.0 существует проблема с вызовом String.IndexOf, см. Исправление 2467309, оно может помочь вам решить ваш ответ.

...