<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.performance.php',
    1 => 'Rendimiento',
    2 => 'Rendimiento',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintaxis de expresiones regulares PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.recursive.php',
    1 => 'Patrones recursivos',
  ),
  'next' => 
  array (
    0 => 'reference.pcre.pattern.modifiers.php',
    1 => 'Opciones disponibles para las expresiones regulares',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Rendimiento</h2>
  <p class="para">
   Ciertos elementos que pueden aparecer en patrones son más eficientes
   que otros. Es más eficiente usar una clase de caracteres como [aeiou] que un conjunto de alternativas como (a|e|i|o|u).
   En general, la construcción más simple que proporciona el
   comportamiento requerido suele ser la más eficiente. El libro de Jeffrey
   Friedl contiene mucha discusión sobre cómo optimizar expresiones regulares para un rendimiento eficiente.
  </p>
  <p class="para">
   Cuando un patrón comienza con .* y la <a href="reference.pcre.pattern.modifiers.php" class="link">opción PCRE_DOTALL</a> está
   establecida, el patrón está implícitamente anclado por PCRE, ya que
   solo puede coincidir al inicio de una cadena de sujeto. Sin embargo, si
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a> no está establecida, PCRE no puede hacer esta optimización,
   porque el metacarácter . no coincide entonces con un salto de línea,
   y si la cadena de sujeto contiene saltos de línea, el patrón puede
   coincidir desde el carácter inmediatamente después de uno de ellos
   en lugar de desde el principio. Por ejemplo, el patrón

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

   coincide con la cadena de sujeto &quot;first\nand second&quot; (donde \n representa
   un carácter de nueva línea) con la primera subcadena capturada siendo
   &quot;and&quot;. Para hacer esto, PCRE tiene que volver a intentar la coincidencia
   comenzando después de cada salto de línea en el sujeto.
  </p>
  <p class="para">
   Si está utilizando un patrón como este con cadenas de sujeto que no contienen saltos de línea, el mejor rendimiento se obtiene estableciendo <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>,
   o comenzando el patrón con ^.* para
   indicar anclaje explícito. Esto ahorra a PCRE tener que escanear a lo largo del sujeto buscando un salto de línea para reiniciar.
  </p>
  <p class="para">
   Tenga cuidado con los patrones que contienen repeticiones indefinidas anidadas.
   Estos pueden tardar mucho tiempo en ejecutarse cuando se aplican a una cadena
   que no coincide. Considere el fragmento de patrón

   <code class="literal">(a+)*</code>
  </p>
  <p class="para">
   Esto puede coincidir con &quot;aaaa&quot; de 33 maneras diferentes, y este número
   aumenta muy rápidamente a medida que la cadena se alarga. (La repetición *
   puede coincidir 0, 1, 2, 3 o 4 veces, y para cada uno de
   esos casos excepto 0, las repeticiones + pueden coincidir con diferentes
   números de veces.) Cuando el resto del patrón es tal que
   toda la coincidencia va a fallar, PCRE en principio
   tiene que probar cada variación posible, y esto puede tomar un
   tiempo extremadamente largo.
  </p>
  <p class="para">
   Una optimización atrapa algunos de los casos más simples como
   <code class="literal">(a+)*b</code>
   donde un carácter literal sigue. Antes de embarcarse en el
   procedimiento de coincidencia estándar, PCRE verifica que hay una &quot;b&quot;
   más adelante en el sujeto, y si no la hay, falla la coincidencia inmediatamente. Sin embargo, cuando no hay un carácter literal siguiente, esta optimización no puede usarse. Puede ver la diferencia comparando el comportamiento de

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

   con el patrón anterior. El primero da un fallo casi
   instantáneamente cuando se aplica a una línea completa de caracteres &quot;a&quot;,
   mientras que el segundo tarda un tiempo apreciable con cadenas
   más largas que unas 20 caracteres.
  </p>
 </div><?php manual_footer($setup); ?>