Utilisation de eval() avec PHP5

10 novembre 2007 par Olivier Mansour

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 ?

Pour soutenir ce site, n'hésitez pas à cliquer sur un de ces liens :

  1. Par Hugo le 15 janvier 2008 | Répondre

    Merci pour ce petit test de benchmarking :)

Commentaires

RSS des commentaires pour ce post