PHP 5.5.16 is released

Performance

Certaines séquences de recherches sont plus efficaces que d'autres. Ainsi, il est plus efficace d'utiliser une classe de caractères telle que [aeiou] plutôt qu'une alternative (a|e|i|o|u). 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's contient de nombreuses études à propos de l'optimisation des expressions rationnelles.

Lorsqu'un masque commence par.* et que l'option PCRE_DOTALL est activée, le masque est implicitement ancré par PCRE, étant donné qu'il ne peut que rechercher au début de la chaîne. Cependant, si l'option PCRE_DOTALL n'est pas activée, PCRE ne peut faire aucune optimisation car le métacaractères point "." 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, (.*)second acceptera la chaîne "premier \net second" (avec "\n" qui remplace la nouvelle ligne), et la première chaîne capturée sera "et". Afin d'effectuer la recherche, PCRE va essayer d'appliquer le masque à partir de chaque début de ligne.

Si vous utilisez un tel masque avec des chaînes qui ne contiennent pas de caractères de nouvelle ligne, les meilleures performances seront atteintes avec l'option PCRE_DOTALL, ou en ancrant le masque avec ^.*. Cela évite à PCRE de scanner toute la chaîne pour rechercher un caractère de nouvelle ligne et recommencer la recherche.

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, (a+)*

Ce masque peut accepter "aaaa" de 33 manières différentes, et ce nombre croit rapidement avec la taille de la chaîne (le quantificateur * peut prendre les valeurs de 0, 1, 2, 3, ou 4, et pour chaque cas non nul, le quantificateur + peut prendre différentes valeurs). Lorsque le reste de la chaîne est tel que l'on s'achemine vers un échec, PCRE doit en principe vérifier toutes les possibilités, et cela prend un temps extrêmement long.

Un optimiseur repère les cas les plus simples, tel que (a+)*b où un caractère simple suit les quantificateurs. Avant de partir dans les procédures standards de recherche, PCRE s'assure qu'il y a au moins un "b" dans la chaîne, et si ce n'est pas le cas, l'échec est annoncé immédiatement. Sinon, il n'y a pas d'optimisation dans la recherche. Vous pouvez voir la différence de comportement avec le masque suivant : (a+)*\d. Le premier retourne un échec quasi-immédiatement, s'il est appliqué à une ligne de "a", alors que le second masque prend un temps significatif pour une chaîne de plus de 20 caractères.

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top