Почему C # скомпилированные регулярные выражения быстрее, чем эквивалентные строковые методы?

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

Я пытался сравнить различные методы (hs является "стогом сена" искать,ndl является «иглой»; искать,repl это восстановительная стоимость.regex всегда создается сRegexOptions.Compiled вариант):

hs.Replace( ndl, repl ) vs regex.Replace( hs, repl ) hs.Contains( ndl ) vs regex.IsMatch( hs )

Я обнаружил довольно много дискуссий, посвященныхwhich из двух техник быстрее (1, 2, 3и множество других), но эти обсуждения всегда, кажется, сосредоточены на:

Use the string version for simple operations and regex for complex operations (which, from a raw performance perspective, doesn't even seem to be necessarily a good idea), or Run a test and compare the two ( and for equivalent tests, the regex version seems to always perform better ).

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

Так,why регулярные выражения быстрее?

* На самом деле,only Случай, когда мне удалось показать, что строковая версия быстрее, чем скомпилированное регулярное выражение при поиске пустой строки! В любом другом случае, от односимвольных строк до очень длинных строк, скомпилированное регулярное выражение обрабатывается быстрее, чем эквивалентный строковый метод.

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

Ответы на вопрос(3)

Ваш ответ на вопрос