2010-07-01 1 views
2

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

Мне было интересно, будет ли Regex лучше идея? В какой точке Regex будет быстрее стандартного сравнения строк? Он основан на длине сравниваемых строк или количестве сравниваемых строк?

+3

Регулярные операции поиска строк обычно превосходят их эквиваленты регулярных выражений, независимо от длины строки. Если вы можете сделать это с помощью обычной находки, используйте обычную находку. – Amber

+4

, когда IndexOf и Содержит не будет работать для того, что вы ищете. – Will

ответ

2

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

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

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

CultureInfo.InvariantCulture.CompareInfo.IndexOf(..) 

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

Вот хорошая статья получить максимум из регулярных выражений: Optimizing Regular Expression Performance

2

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

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

1

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^