Preg VS Ereg
preg_replace() et ereg_replace() sont quasiment identiques et pourtant, dans la documentation de php, sur la page concernant ereg_replace(), un beau message s'affiche dans le bas de la page :
Astuce : preg_replace(), qui utilise la syntaxe des expressions rationnelles compatibles PERL, est une alternative plus rapide de ereg_replace().
Nous allons voir dans cet article la différence de performances entre ces deux fonctions...
Benchmark, quand tu nous tiens !
Pour changer, nous allons faire des Bench ! Nous utilisons le code habituel du bench, les tests sont effectués sur un Pentium 4 cadencé à 2.53 GHz avec 1Go de DDR.
Nous allons supprimer tous les tags html d'une page :
"Vous pensez vraiment que ereg_replace() est plus rapide que preg_replace ? Oui ??? On va vérifier !"
C'est vrai, j'aurai pu utiliser str_replace qui est beaucoup plus rapide, donc on va en profiter pour faire un bench avec...
Exemple 1 : ereg_replace() :
<?php |
Exemple 2 : preg_replace() :
<?php |
Exemple 3 : str_replace() :
<?php |
Résultats
Exemple 1 : ereg_replace() :
time index | ex time | % | |
Start | 1112868847.35656100 | - | 0.00% |
Stop | 1112868847.37001700 | 0.013456 | 100.00% |
total | - | 0.013456 | 100.00% |
Exemple 2 : preg_replace() :
time index | ex time | % | |
Start | 1112868770.03391900 | - | 0.00% |
Stop | 1112868770.04914400 | 0.015225 | 100.00% |
total | - | 0.015225 | 100.00% |
Exemple 3 : str_replace() :
time index | ex time | % | |
Start | 1112868905.40360800 | - | 0.00% |
Stop | 1112868905.40737600 | 0.003768 | 100.00% |
total | - | 0.003768 | 100.00% |
Hum... Petit problème là ? ereg_replace() se révèle être plus rapide que preg_replace pour une chaîne fixe... Seulement, n'oublions pas que la fonction str_replace ne sert qu'à remplacer des chaînes fixes et qu'elle permet de traiter la chaîne encore plus rapidement (ici : +/- 5 fois plus vite) Nous n'allons pas en rester là, nous allons effectuer des tests plus complexes avec ereg_replace() et preg_replace().
Test avancé des fonctions
Nous allons maintenant passer à la deuxième batterie de tests, les fonctions devront transformer une série de 20 url's très différentes en liens cliquables... le tout 1000 fois !
Voici le code qui sera commun pour les deux bench :
<?php |
Et nous allons y insérer comme premier bench pour la fonction ereg_replace() :
ereg_replace('[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]','<a href=""></a>',$texte); |
Et en second lieu, pour preg_replace() :
preg_replace('`(((https?|ftp)://(w.)?)(?<!www)(w+-?)*.([a-z]))`','<a href="$1">$1</a>',$texte); |
Résultats
Bench 1 (ereg_replace()) :
time index | ex time | % | |
Start | 1112891604.56258600 | - | 0.00% |
Stop | 1112891604.86398900 | 0.301403 | 100.00% |
total | - | 0.301403 | 100.00% |
Bench 2 (preg_replace()) :
time index | ex time | % | |
Start | 1112892268.25008700 | - | 0.00% |
Stop | 1112892268.53282000 | 0.282733 | 100.00% |
total | - | 0.282733 | 100.00% |
Tous ces tests ont été effectués sur windows qui n'inclus pas POSIX dans ses distributions.
Voici le même test sous linux :
Bench 1 (ereg_replace()) :
time index | ex time | % | |
Start | 1112950698.18014600 | - | 0.00% |
Stop | 1112950698.88332700 | 0.703181 | 100.00% |
total | - | 0.703181 | 100.00% |
Bench 2 (preg_replace()) :
time index | ex time | % | |
Start | 1112950580.78931900 | - | 0.00% |
Stop | 1112950580.84425100 | 0.054932 | 100.00% |
total | - | 0.054932 | 100.00% |
Conclusion
Il est clair que dans les tests effectués ici, les gains de performances sont très faibles et même parfois, ereg_replace se révèle être légèrement plus rapide... sur Windows, seulement, les résultats des Benchmarks sont tout à fait différents sous linux...
Etant donné que la majorité des serveurs fonctionne sur linux, je vous conseille vivement d'utiliser preg_replace() (et toutes les fonctions du même genre : preg_match(), preg_match_all() etc...) au lieu de ereg_replace() (et toutes les fonctions du même genre : ereg(), eregi_replace() etc... )
Il faut savoir aussi que les expression régulières compatibles POSIX permettent de faire de meilleures recherches que les expressions régulières de ereg()... Voyez la documentation de php pour plus de précisions à ce sujet.
Et c'est ainsi que se termine le test de confrontation entre ereg_replace() et preg_replace().