par
AB » 12 sept. 2007, 01:50
[Edit de Zeus] J'ai remis ton message original dans le message où tu était connecté
J'avais bien compris. Si tu avais été légèrement plus diplomate, ou un peu moins catégorique, je n'aurais pas fait cette réponse
Enfin toujours est-il que pour en avoir le coeur net, j'ai fait quelques bench sur un tableau de 11120 éléments ("sdfrpgmdnr.png","gfhlgvtdyiy.gif","frtyuiopdeqf.jpg","treuuiopf.txt","qszertyf.doc" répétés).
Voici ma procédure de test (en local sur EasyPHP2):
$lettre = 'f';
$tab = array();
$moyenne = array();
for ($i=0; $i < 100; $i++)
{
$time_start = microtime(true);
foreach ($tableau as $f)
{
//$nom = eregi_replace('\.[^.]*$', "", $f);
//$nom = preg_replace('#\.[^.]*$#', "", $f);
//$nom = substr($f,0,strrpos($f,'.'));
//if(eregi("^$lettre.*", $f)) $tab[] = $f;
//if(preg_match("#^$lettre.*#i", $f)) $tab[] = $f;
//if(strpos(strtolower($f), strtolower($lettre)) === 0) $tab[] = $f;
//(strpos(strtolower($f), strtolower($lettre)) === 0)? $tab[] = $f :'';
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$moyenne[] = $time;
usleep(50000);
}
echo array_sum($moyenne)/count($moyenne);
et voici le résultat sur les trois premières lignes:
Pour le reste, les résultats sont moins significatifs au niveau du temps d'exécution:
if(eregi("^$lettre.*", $f)) $tab[] = $f;// temps : 0.042
if(preg_match("#^$lettre.*#i", $f)) $tab[] = $f;// temps : 0.040
if(strpos(strtolower($f), strtolower($lettre)) === 0) $tab[] = $f;// temps : 0.034
preg est très légèrement plus rapide qu'eregi et consomme 2 à 3 % de ressources UC en moins.
La solution strpos, arrive légèrement en tête et elle offre l'avantage de consommer environ 6 à 10% de ressources UC en moins qu'eregi.
Concernant la dernière ligne pour la comparaison avec l'opérateur ternaire
(strpos(strtolower($f), strtolower($lettre)) === 0)? $tab[] = $f :''; //temps : 0.037
pour une utilisation UC équivalente à la solution avec if
Le plus étonnant c'est que même
if(strpos(strtolower($f), strtolower($lettre)) === 0) $tab[] = $f; else $tab[] = $lettre;
conserve le même avantage par rapport à
$tab[] = (strpos(strtolower($f), strtolower($lettre)) === 0)? $f : $lettre;
tout en semblant consommer un chouilla moins de ressources UC
Dans ce test l'opérateur ternaire est donc toujours très légèrement en retard.
Conclusion:
- Le premier graphique donne amplement raison au manuel php (heureusement!). Quand on peut éviter les expressions régulières en les remplaçant par deux fonctions simples, y'a pas photo.
- Preg_match est non seulement plus rapide qu'ereg mais il consomme aussi moins de ressources.
- Quand il faut plus de deux fonctions, l'écart diminue et s'inverserait probablement dans des cas plus complexes.
- Moi qui avait lu que les opérateurs ternaires étaient plus rapides à l'exécution. Ben non, pas dans ce test du moins.
note: j'ai pris les regex tels qu'ils ont été écrits. En optimisant le regex pour rechercher la première lettre
if(preg_match("#^$lettre#i", $f)) $tab[] = $f;// temps = 0.038
pour une consommation ressource UC équivalente à la solution strpos
[color=darkred][[b]Edit [/b]de [b]Zeus[/b]] J'ai remis ton message original dans le message où tu était connecté ;)[/color]
J'avais bien compris. Si tu avais été légèrement plus diplomate, ou un peu moins catégorique, je n'aurais pas fait cette réponse :wink:
Enfin toujours est-il que pour en avoir le coeur net, j'ai fait quelques bench sur un tableau de 11120 éléments ("sdfrpgmdnr.png","gfhlgvtdyiy.gif","frtyuiopdeqf.jpg","treuuiopf.txt","qszertyf.doc" répétés).
Voici ma procédure de test (en local sur EasyPHP2):
[php]$lettre = 'f';
$tab = array();
$moyenne = array();
for ($i=0; $i < 100; $i++)
{
$time_start = microtime(true);
foreach ($tableau as $f)
{
//$nom = eregi_replace('\.[^.]*$', "", $f);
//$nom = preg_replace('#\.[^.]*$#', "", $f);
//$nom = substr($f,0,strrpos($f,'.'));
//if(eregi("^$lettre.*", $f)) $tab[] = $f;
//if(preg_match("#^$lettre.*#i", $f)) $tab[] = $f;
//if(strpos(strtolower($f), strtolower($lettre)) === 0) $tab[] = $f;
//(strpos(strtolower($f), strtolower($lettre)) === 0)? $tab[] = $f :'';
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$moyenne[] = $time;
usleep(50000);
}
echo array_sum($moyenne)/count($moyenne);[/php]
et voici le résultat sur les trois premières lignes:
[img]http://www.abciweb.net/archives/bench_preg.png[/img]
Pour le reste, les résultats sont moins significatifs au niveau du temps d'exécution:
[php]if(eregi("^$lettre.*", $f)) $tab[] = $f;// temps : 0.042
if(preg_match("#^$lettre.*#i", $f)) $tab[] = $f;// temps : 0.040
if(strpos(strtolower($f), strtolower($lettre)) === 0) $tab[] = $f;// temps : 0.034[/php]
preg est très légèrement plus rapide qu'eregi et consomme 2 à 3 % de ressources UC en moins.
La solution strpos, arrive légèrement en tête et elle offre l'avantage de consommer environ 6 à 10% de ressources UC en moins qu'eregi.
Concernant la dernière ligne pour la comparaison avec l'opérateur ternaire
[php](strpos(strtolower($f), strtolower($lettre)) === 0)? $tab[] = $f :''; //temps : 0.037 [/php]pour une utilisation UC équivalente à la solution avec if
Le plus étonnant c'est que même
[php]if(strpos(strtolower($f), strtolower($lettre)) === 0) $tab[] = $f; else $tab[] = $lettre;[/php] conserve le même avantage par rapport à
[php]$tab[] = (strpos(strtolower($f), strtolower($lettre)) === 0)? $f : $lettre;[/php]
tout en semblant consommer un chouilla moins de ressources UC
Dans ce test l'opérateur ternaire est donc toujours très légèrement en retard.
Conclusion:
- Le premier graphique donne amplement raison au manuel php (heureusement!). Quand on peut éviter les expressions régulières en les remplaçant par deux fonctions simples, y'a pas photo.
- Preg_match est non seulement plus rapide qu'ereg mais il consomme aussi moins de ressources.
- Quand il faut plus de deux fonctions, l'écart diminue et s'inverserait probablement dans des cas plus complexes.
- Moi qui avait lu que les opérateurs ternaires étaient plus rapides à l'exécution. Ben non, pas dans ce test du moins.
note: j'ai pris les regex tels qu'ils ont été écrits. En optimisant le regex pour rechercher la première lettre[php]if(preg_match("#^$lettre#i", $f)) $tab[] = $f;// temps = 0.038[/php]
pour une consommation ressource UC équivalente à la solution strpos