article preg vs ereg

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
require 'Timer.php'; // Ouverture du fichier Timer.php contenant la classe du Benchmark

$chaine='Vous pensez vraiment que ereg_replace() est plus rapide que preg_replace() ? Oui ??? On va v&eacute;rifier !';
$timer = new Benchmark_Timer(TRUE);
$timer->start();
for(
$i=1;$i<=1000;++$i)
{
ereg_replace('ereg)','preg',$chaine);
}
$timer->stop();
?>

Exemple 2 : preg_replace() :

<?php
$chaine
='Vous pensez vraiment que ereg_replace() est plus rapide que preg_replace ? Oui ??? On va v&eacute;rifier !';

// Début du bench
preg_replace('´ereg´*','preg',$chaine);
?>

Exemple 3 : str_replace() :

<?php
require 'Timer.php'; // Ouverture du fichier Timer.php contenant la classe du Benchmark

$chaine='Vous pensez vraiment que ereg_replace() est plus rapide que preg_replace() ? Oui ??? On va v&eacute;rifier !';
$timer = new Benchmark_Timer(TRUE);
$timer->start();
for(
$i=1;$i<=1000;++$i)
{
str_replace('ereg','preg',$chaine);
}
$timer->stop();
?>

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
require 'Timer.php'; // Ouverture du fichier Timer.php contenant la classe du Benchmark

$url[]='http://www.wampserver.com';
$url[]='http://www.php.net';
$url[]='http://www.phpmyadmin.net/';
$url[]='http://www.mysql.com';
$url[]='http://www.be-sport.be';
$url[]='http://www.clubic.com';
$url[]='https://www.gmail.com';
$url[]='http://www.mamboserver.com/';
$url[]='http://www.wampserver.com';
$url[]='ftp://www.sourceforge.net';
$url[]='http://www.sqlitemanager.net';
$url[]='http://www.phpbb-fr.com';
$url[]='http://www.perdu.com';
$url[]='http://www.google.fr';
$url[]='http://www.phpdebutant.org';
$url[]='http://www.az-php.com';
$url[]='http://www.eaccelerator.net';
$url[]='http://www.free.fr';
$url[]='http://www.getfirefox.com';
$url[]='http://www.mozilla.com';
$texte=implode('<br>',$url);

$timer = new Benchmark_Timer(TRUE);
$timer->start();
for(
$i=1;$i<=1000;++$i)
{
// preg_replace() et ereg_replace()
}
$timer->stop();
?>

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().