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

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

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

hs.Replace( ndl, repl ) противregex.Replace( hs, repl )hs.Contains( ndl ) против меняregex.IsMatch( hs )

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

Используйте строковую версию для простых операций и регулярное выражение для сложных операций (что, с точки зрения производительности, недаже не кажется хорошей идеей), илиЗапустите тест и сравните два (и для эквивалентных тестов версия регулярного выражения, кажется, всегда работает лучше).

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

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

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

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

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

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