





Я не уверен, что ты сможешь. Если вы ознакомитесь с Освоение регулярных выражений, некоторые методы оптимизации, специфичные для PHP, обсуждаются в главе 10: PHP. В частности, использование модификатора шаблона S, чтобы механизм регулярных выражений «изучал» регулярное выражение перед его применением. В зависимости от вашего шаблона и вашего текста, это может дать вам некоторое улучшение скорости.
Редактировать: вы можете заглянуть в содержание книги, используя books.google.com.
Регулярные выражения preg могут использовать модификатор S (учеба) в верхнем регистре, что, вероятно, именно то, что вам нужно.
http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
S
When a pattern is going to be used several times, it is worth spending more time analyzing it in order to speed up the time taken for matching. If this modifier is set, then this extra analysis is performed. At present, studying a pattern is useful only for non-anchored patterns that do not have a single fixed starting character.
Ответ на вопрос OP заключается в том, что нет необходимости предварительно компилировать регулярные выражения в PHP, потому что, как отметил 1stvamp, скомпилированные регулярные выражения кэшируются автоматически. Модификатор «S» - это отдельная тема.
Этот ответ был добавлен в Часто задаваемые вопросы о регулярных выражениях при переполнении стека в разделе «Модификаторы».
Библиотека регулярных выражений, совместимая с Perl, возможно, уже была оптимизирована для вашего варианта использования без предоставления класса Regex, как это делают другие языки:
This extension maintains a global per-thread cache of compiled regular expressions (up to 4096).
Таким образом модификатор исследования, описанный в Имран, может сохранять скомпилированное выражение между вызовами.
Могу ли я увеличить размер кеша для каждого потока и что означает 4096
Я думаю, это означает 4096 скомпилированных регулярных выражений.
Как уже сказал другой комментатор, регулярные выражения PCRE уже скомпилированы без необходимости специально ссылаться на них как таковые, PCRE сохраняет внутренний хеш, индексированный исходной строкой, которую вы указали.
Поток - это поток, в котором в настоящее время выполняется сценарий. После первого использования скомпилированное регулярное выражение кэшируется, и при следующем использовании PHP не компилирует его снова.
Простой тест:
<?php
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
// test string
$text='The big brown <b>fox</b> jumped over a lazy <b>cat</b>';
$testTimes=10;
$avg=0;
for ($x=0; $x<$testTimes; $x++)
{
$start=microtime_float();
for ($i=0; $i<10000; $i++) {
preg_match_all('/<b>(.*)</b>0?/', $text, $m);
}
$end=microtime_float();
$avg += (float)$end-$start;
}
echo 'Regexp with caching avg '.($avg/$testTimes);
// regexp without caching
$avg=0;
for ($x=0; $x<$testTimes; $x++)
{
$start=microtime_float();
for ($i=0; $i<10000; $i++) {
$pattern='/<b>(.*)</b>'.$i.'?/';
preg_match_all($pattern, $text, $m);
}
$end=microtime_float();
$avg += (float)$end-$start;
}
echo '<br/>Regexp without caching avg '.($avg/$testTimes);
Regexp with caching avg 0.1 Regexp without caching avg 0.8
Кеширование регулярного выражения делает его в 8 раз быстрее!
$i does not exist in the pattern and it's always 0 in that place
Тем не менее, тест разумно действительный. Путем объединения строки «$ j- $ y» с $ j = 37 и $ y = 5 в первом тесте и строки «$ i- $ x» во втором (- $ x отменяет любое кеширование путем testTimes), я получаю время 0,0112 и 0,0431. То же самое 0,0431 получается при использовании «$ i- $ y» во втором тесте, что означает, что действительно размер кеша меньше 10000. Таким образом, мое фактическое ускорение составляет В 4 раза быстрее (а не 8).
Эту книгу должен прочитать каждый разработчик, использующий регулярные выражения !! В этой книге описаны все методы, необходимые для повышения эффективности.