<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/reference.pcre.pattern.syntax.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.performance.php',
    1 => 'Производительность',
    2 => 'Производительность',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Синтаксис регулярных выражений',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.recursive.php',
    1 => 'Рекурсивные шаблоны',
  ),
  'next' => 
  array (
    0 => 'reference.pcre.pattern.modifiers.php',
    1 => 'Модификаторы шаблонов',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/pcre/pattern.syntax.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="regexp.reference.performance" class="section">
  <h2 class="title">Производительность</h2>
  <p class="para">
   Некоторые элементы, которые встречаются в шаблонах, более
   эффективны, чем другие. Например, символьный класс [aeiou]
   работает гораздо эффективнее набора альтернатив (a|e|i|o|u).
   Как правило, более простая конструкция наболее эффективна.
   Книга Джеффри Фридла содержит много обсуждений вопроса оптимизации
   регулярных выражений.
  </p>
  <p class="para">
   Если шаблон начинается с .* и включили флаг
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>,
   шаблон неявно заякоривается, поскольку шаблон может совпадать только
   в начале строки. Но если модификатор
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>
   не включили, PCRE не может выполнить соответствующую оптимизацию,
   поскольку в этой ситуации метасимвол «.» не соответствует символу начала
   строки (если обрабатываемые данные содержат переводы строк, такой шаблон
   может соответствовать шаблону не от начала строки, а от позиции
   непосредственно после перевода строки).
   Например, применяя шаблон

   <code class="literal">(.*) second</code>

   к строке «first\nand second» (где \n — символ перевода строки), значение,
   которое захватил первый подшаблон, будет «and».
   Чтобы обработать все возможные точки соответствия, модуль PCRE пытается
   сопоставить шаблон после каждого символа перевода строки.
  </p>
  <p class="para">
   При работе с подобными шаблонами и обработке
   данных без переводов строк для лучшей производительности
   включают модификатор
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>,
   либо начинают шаблон с циркумфлекса ^.* для явного заякоривания.
   Это защитит модуль PCRE от поиска символов новых строк и дополнительных
   попыток сопоставить шаблон с каждой такой найденной позицией.
  </p>
  <p class="para">
   Избегайте шаблонов, которые содержат вложенные неограниченные повторения.
   Сопоставление таких шаблонов со строками, которые не содержат совпадений,
   занимает длительное время. Рассмотрим пример шаблона

   <code class="literal">(a+)*</code>
  </p>
  <p class="para">
   Он может соответствовать значению «aaaa» тридцатью тремя различными способами,
   и эта цифра очень быстро растёт при увеличении строки. (В примере
   квантификатор * может совпадать 0, 1, 2, 3 или 4 раза,
   и для каждого такого случая, кроме нуля, квантификатор + также может
   совпадать различное число раз.) Если остаток шаблона таков, что все
   совпадение терпит неудачу, модуль PCRE должен попробовать все возможные
   варианты совпадения, что может потребовать огромного количества времени.
  </p>
  <p class="para">
  За счёт оптимизации отлавливают наиболее простые случаи наподобие

   <code class="literal">(a+)*b</code>

   где следом идёт литеральный символ. Перед началом стандартной
   процедуры поиска модуль PCRE проверяет в следующей подстроке наличие
   символа «b», и если символа нет, попытка сопоставления
   немедленно завершается неудачей. Однако, когда последующего литерала нет,
   оптимизация не может быть применена. Разница заметна при сравнении поведения шаблона

   <code class="literal">(a+)*\d</code>

   с поведением приведённого выше шаблона. Первый определяет
   невозможность сопоставления практически сразу, при сопоставлении
   со строкой, которая состоит из символов «a», тогда как второй
   тратит длительное время на поиск в строках с длиной больше 20 символов.
  </p>
 </div><?php manual_footer($setup); ?>