<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.performance.php',
    1 => 'Performance',
    2 => 'Performance',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Fonctionnement des expressions r&eacute;guli&egrave;res',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.recursive.php',
    1 => 'Masques r&eacute;cursifs',
  ),
  'next' => 
  array (
    0 => 'reference.pcre.pattern.modifiers.php',
    1 => 'Options disponibles pour les expressions r&eacute;guli&egrave;res',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Performance</h2>
  <p class="para">
   Certaines séquences de recherches sont plus efficaces que d&#039;autres.
   Ainsi, il est plus efficace d&#039;utiliser une classe de caractères
   telle que <code class="literal">[aeiou]</code> plutôt qu&#039;une alternative
   <code class="literal">(a|e|i|o|u)</code>.
   En général, le masque le plus simple, qui permette
   la recherche désirée est le plus efficace. Le livre
   de Jeffrey Friedl&#039;s contient de nombreuses études à
   propos de l&#039;optimisation des expressions régulières.
  </p>
  <p class="para">
   Lorsqu&#039;un masque commence par.* et que l&#039;option
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a> est
   activée, le masque est implicitement ancré par PCRE,
   étant donné qu&#039;il ne peut que rechercher au début
   de la chaîne. Cependant, si l&#039;option
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a> n&#039;est pas
   activée, PCRE ne peut faire aucune optimisation, car le
   métacaractère point &quot;<code class="literal">.</code>&quot;
   ne remplace pas une nouvelle ligne, et si la chaîne
   sujet contient des nouvelles lignes, le masque peut trouver une
   solution qui serait située juste après une
   de ces nouvelles lignes, et non pas seulement au début
   de la chaîne sujet. Par exemple, le masque,
   
   <code class="literal">(.*)second</code>
   
   acceptera la chaîne &quot;<code class="literal">premier \net second</code>&quot;
   (avec &quot;<code class="literal">\n</code>&quot; qui remplace la nouvelle ligne),
   et la première chaîne capturée sera &quot;<code class="literal">et</code>&quot;.
   Afin d&#039;effectuer la recherche, PCRE va essayer d&#039;appliquer le masque
   à partir de chaque début de ligne.
  </p>
  <p class="para">
   Lors de l&#039;utilisation d&#039;un tel masque avec des chaînes qui ne contiennent
   pas de caractères de nouvelle ligne, les meilleures performances
   seront atteintes avec l&#039;option
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>, ou en ancrant le
   masque avec <code class="literal">^.*</code>. Cela évite à PCRE
   de scanner toute la chaîne pour rechercher un caractère
   de nouvelle ligne et recommencer la recherche.
  </p>
  <p class="para">
   Attention aux masques qui contiennent des quantificateurs infinis
   imbriqués. Ils peuvent demander un temps de calcul très
   long, lorsque appliqués à une chaîne qui ne
   correspond pas à ce masque. Par exemple,
   
   <code class="literal">(a+)*</code>
   
  </p>
  <p class="para">
   Ce masque peut accepter &quot;<code class="literal">aaaa</code>&quot; de 33 manières
   différentes, et ce nombre croît rapidement avec la taille
   de la chaîne (le quantificateur <code class="literal">*</code> peut prendre
   les valeurs de 0, 1, 2, 3, ou 4, et pour chaque cas non nul, le
   quantificateur <code class="literal">+</code> peut prendre différentes
   valeurs). Lorsque le reste de la chaîne est tel que l&#039;on s&#039;achemine
   vers un échec, PCRE doit en principe vérifier
   toutes les possibilités, et cela prend un temps
   extrêmement long.
  </p>
  <p class="para">
   Un optimiseur repère les cas les plus simples, tel que
   
   <code class="literal">(a+)*b</code>
   
   où un caractère simple suit les quantificateurs.
   Avant de partir dans les procédures standards de recherche, PCRE
   s&#039;assure qu&#039;il y a au moins un &quot;<code class="literal">b</code>&quot; dans la
   chaîne, et si ce n&#039;est pas le cas, l&#039;échec est
   annoncé immédiatement. Sinon, il n&#039;y a pas
   d&#039;optimisation dans la recherche. Il est possible de voir la
   différence de comportement avec le masque suivant :
   
   <code class="literal">(a+)*\d</code>.
   
   Le premier retourne un échec quasi-immédiatement, s&#039;il est appliqué à
   une ligne de &quot;<code class="literal">a</code>&quot;, alors que le second masque
   prend un temps significatif pour une chaîne de plus de
   20 caractères.
  </p>
 </div><?php manual_footer($setup); ?>