Archives du mot-clé benchmark

Un outils en ligne bien pratique pour optimiser le temps de chargement d’une page web

La société Pingdom propose un outils gratuit pour auditer facilement le temps de chargement d’une page web : Full page test.

Une fois terminé, le test présente un tableau indiquant tous les éléments qui ont été téléchargés et surtout il permet de différencier les temps de connexion, de réaction de votre serveur et de téléchargement.

Enfin, vous avez un petit récapitulatif pour la page en question :

Voici un exemple de résultat avec mon cv.

Instancier un objet dynamiquement sans eval()

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 ?

Utilisation de eval() avec PHP5

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 ?