<?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 => 'it',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.performance.php',
    1 => 'Performance',
    2 => 'Performance',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintassi delle regex PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.recursive.php',
    1 => 'Criteri ricorsivi',
  ),
  'next' => 
  array (
    0 => 'reference.pcre.pattern.modifiers.php',
    1 => 'Possibili modificatori nei pattern regex',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'it',
    '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">
   Certi elementi utilizzati per i criteri di riconoscimento sono più
   efficienti di altri. E&#039; più efficiente usare le classi di caratteri come
   [aeiou] piuttosto che un gruppo di alternative come (a|e|i|o|u).
   In generale la costruzione più semplice per ottenere un dato
   scopo è la più efficiente. Nel libro di Jeffrey Friedl sono
   illustrate varie tecniche sull&#039;ottimizzazione delle espressioni
   regolari.
  </p>
  <p class="para">
   Quando un criterio comincia con .* ed è attiva l&#039;opzione <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>, il
   criterio è implicitamente ancorato da PCRE, dato che può riconoscere
   solo l&#039;inizio della stringa. Tuttavia, se non è attivo
   <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>,
   PCRE non può fare questa ottimizzazione, perché il meta-carattere .
   non riconosce più il carattere di &quot;a capo&quot;, e quindi se la stringa
   contiene dei caratteri di &quot;a capo&quot;, il riconoscimento può par-
   tire dal carattere immediatamente successivo ad uno di questi
   e non dall&#039;inizio. Ad esempio il criterio
   
   <code class="literal">(.*) second</code>
   
   può eseguire un riconoscimento nel testo &quot;first\nand second&quot;
   (dove \n indica il carattere &quot;a capo&quot;) ottenendo &quot;and&quot; come
   prima stringa catturata. perché ciò accada è necessario che
   PCRE possa iniziare il riconoscimento dopo ogni &quot;a capo&quot;.
  </p>
  <p class="para">
   Se si deve usare un simile criterio in stringhe che non contengono
   caratteri di &quot;a capo&quot;, le performance migliori si possono
   ottenere abilitando <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>,
   oppure iniziando il criterio con ^.* in modo da richiedere un
   ancoraggio esplicito. Così si risparmia a PCRE di scandirsi il
   testo alla ricerca di un &quot;a capo&quot; da cui ripartire per la ricerca.
  </p>
  <p class="para">
   Occorre prestare attenzione ai criteri che contengono ripetizioni
   indefinite annidate. Possono richiedere molto tempo se
   applicati a stringhe non riconoscibili. Si consideri il frammento
   
   <code class="literal">(a+)*</code>
  </p>
  <p class="para">
   Questo può riconoscere &quot;aaaa&quot; in 33 modi differenti, e questo
   numero può crescere molto rapidamente se la stringa da riconoscere è più lunga. (Il carattere
   di ripetizione * può eseguire riconoscimenti per 0,1,2,3 o 4 ripetizioni, e per ciascuna di
   esse, tranne lo 0, il carattere di ripetizione + può eseguire riconoscimenti per diversi
   numeri di volte). Quindi se la parte successiva del criterio è tale
   da non permettere il completamento del riconoscimento, PCRE, per principio,
   ugualmente tenta tutte le possibili variazioni, richiedendo
   diverso tempo.
  </p>
  <p class="para">
   Una ottimizzazione riesce a catturare qualche caso semplice
   come in
   
   <code class="literal">(a+)*b</code>
   
   dove si indica che seguirà un  carattere alfanumerico. PCRE,
   prima di imbarcarsi nella procedura standard di riconoscimento,
   verifica se nel testo vi è la  lettera &quot;b&quot;, e  se non c&#039;è
   restituisce immediatamente un esito negativo. Tuttavia se non
   viene indicata una lettera seguente questa ottimizzazione non
   può essere utilizzata. Se ne può notare la differenza analizzando il comportamento del criterio
   
   <code class="literal">(a+)*\d</code>
   
   rispetto al precedente. Il primo, utilizzato con  una  stringa
   composta da &quot;a&quot;, fallisce immediatamente, l&#039;ultimo richiede un
   tempo  apprezzabile, soprattutto  se  applicato a stringhe con
   più di 20 caratteri.
  </p>
 </div><?php manual_footer($setup); ?>