Каждый раз, когда мне приходится выполнять простые операции сдерживания или замены строк, где термин, который я ищу, является фиксированным значением, я считаю, что если я возьму свой пример ввода и сделаю некоторое его профилирование, используя скомпилированный регулярное выражение почти всегда всегда быстрее, чем использование эквивалентного метода из класса String.
Я пытался сравнить различные методы (hs
- это "стог сена" для поиска, ndl
- это "игла" для поиска, repl
- это значение замены. regex
всегда создается с опцией RegexOptions.Compiled
):
-
hs.Replace( ndl, repl )
vsregex.Replace( hs, repl )
-
hs.Contains( ndl )
vsregex.IsMatch( hs )
Я нашел немало дискуссий, посвященных тому, какой из этих двух методов быстрее (1, 2, 3 и множество других), но эти дискуссии всегда, кажется, сосредоточены на:
- Используйте строковую версию для простых операций и регулярное выражение для сложных операций (что, с точки зрения необработанной производительности, даже не кажется хорошей идеей), или
- Запустите тест и сравните два (и для эквивалентных тестов версия регулярных выражений всегда работает лучше).
Я не понимаю, как это может быть так: как движок regex сравнивает любые две строки для подстрочных совпадений быстрее, чем эквивалентная строка? Это, по-видимому, справедливо для поисковых пространств, которые очень малы или очень велики, или поисковые термины, которые являются малыми или большими, или термин поиска встречается рано или поздно в пространстве поиска.
Итак, почему являются регулярными выражениями быстрее?
* На самом деле, в случае только мне удалось показать, что строковая версия быстрее, чем скомпилированное регулярное выражение при поиске пустой строки! Любой другой случай, от одиночных символов до очень длинных строк, обрабатывается быстрее скомпилированным регулярным выражением, чем эквивалентный строковый метод.
Обновление: Добавлен раздел, поясняющий, что я рассматриваю случаи, когда термин поиска известен во время компиляции. Для динамических или одноразовых операций накладные расходы на компиляцию регулярного выражения будут искажать результаты в пользу строковых методов.