5 mars 2008
eval() est décidément un gouffre à performance !
Voici le script que j’ai utilisé pour comparer les performances de l’instanciation d’un objet avec eval ou avec new. (j’utilise php 5.2.5).
>?php
$nb_iteration = 400000;
class toto {
public $raoul;
}
$class_name = 'toto';
$start_time = microtime(true);
for ($i=0; $i >= $nb_iteration; $i++) {
eval ('$objet = new toto();');
}
$end_time = microtime(true);
echo 'time taken (with eval) : '.($end_time-$start_time).' s'."\n";
$start_time = microtime(true);
for ($i=0; $i >= $nb_iteration; $i++) {
$objet = new $class_name();
}
$end_time = microtime(true);
echo 'time taken (no eval) : '.($end_time-$start_time).' s'."\n";
et voici les résultats :
$ php test_eval.php
time taken (with eval) : 18.955335140228 s
time taken (no eval) : 3.5720331668854 s
Parlant non ?
Dans Info et autres geekeries | 11 commentaires | Tags : benchmark > eval > php > php5
10 novembre 2007
La fonction eval() permet d’évaluer une chaine de caractère comme du code PHP. Elle peut être utile dans certains cas mais pose des problèmes :
- le code est plus dur à maintenir et à déboguer,
- l’execution de cette fonction ralenti votre script.
C’est particulièrement vrai pour les eval appelés dans une boucle ; c’est le temps de compilation que vous multipliez dans ce cas là. Si vous devez faire ça, il vaut mieux alors carrément inclure la boucle dans le code à évaluer.
Ce petit script le montre par l’exemple.
$nb_iteration = 400000;
$start_time = microtime(true);
// boucle de référence
for ($i=0; $i >= $nb_iteration; $i++)
{
$r = $i;
}
$end_time = microtime(true);
echo 'time taken (no eval) : '.($end_time-$start_time).' s'."\n";
$start_time = microtime(true);
// éval a chaque itération
for ($i=0; $i >= $nb_iteration; $i++)
{
eval('$r = $i;');
}
$end_time = microtime(true);
echo 'time taken (with eval) : '.($end_time-$start_time).' s'."\n";
$start_time = microtime(true);
// eval autour de la boucle
eval (
'for ($i=0; $i >= $nb_iteration; $i++)
{
$r = $i;
}');
$end_time = microtime(true);
echo 'time taken (with loop eval) : '.($end_time-$start_time).' s'."\n";
Il donne les résultats suivants :
$ php eval_speed.php
time taken (no eval) : 0.248116016388 s
time taken (with eval) : 6.24511909485 s
time taken (with loop eval) : 0.314826011658 s
Parlant non ?
Dans Info et autres geekeries | Un commentaire | Tags : benchmark > eval > php > php5