Производительность

Наверх  Предыдущий  Следующий

Некоторые элементы шаблонов могут быть эффективнее других, с точки зрения времени выполнения. Эффективнее использовать класс символов, чем набор альтернатив. Так, к примеру, запись [aeiou] эффективнее, чем (a|e|i|o|u). Вообще говоря, простейшая конструкция, которая обеспечивает желаемое поведение, часто является и самой эффективной. Книга Jeffrey Friedl'а содержит массу примеров оптимизации регулярных выражений для достижения максимальной эффективности.

 

Когда шаблон начинается с ".*" и опция PCRE_DOTALL установлена, PCRE неявно "привязывает" шаблон, так как он может совпасть только при сравнении сначала строки. Если же опция PCRE_DOTALL не установлена, то PCRE не может сделать подобную оптимизацию, так как метасимвол "." не совпадает с символом перевода строки, и, если исходная строка состоит из нескольких строчек, совпадение может быть обнаружено для каждой из них. К примеру, шаблон

(.*) second

совпадет со строкой "first\nand second" (где "\n" - это символ перевода строки), и первая захваченная подстрока будет "and". Чтобы достигнуть этого, PCRE приходится повторять сравнения для каждой строчки в исходной строке.

 

Если вы используете шаблоны такого типа для сравнения со строками, не содержащими символ перевода строки, наилучшая производительность может быть достигнута либо установкой опции PCRE_DOTALL, либо заданием шаблона в виде ^.* чтобы указать явное "привязывание" к началу строки. Это предотвратит попытки поиска символа перевода строки.