mercredi 14 avril 2010
Une chose que je vois souvent dans du code PHP, c'est de faire une boucle for avec comme condition le count(array) à l'intérieur.
for($i=0 ; $i < count($arr); $i++)Une explication qu'on m'a donné pour utiliser ce moyen est qu'on n'a pas à déclarer une variable pour stocker le résultat du count() et qu'on sauve une ligne de code. D'un point de vue, c'est vrai, mais d'un autre, ça peut affecter la performance selon l'application que vous en faites, sans compter qu'on n'est pas à quelques bytes de mémoire vive près.
Le vrai désavantage ici est qu'à chaque itération de la boucle, il doit rappeler la fonction pour vérifier la valeur comptée qui correspond au nombre de résultats de l'array (qui ne devrait pas changer en cours de route). Si on avait d'abord extrait le total, on optimiserait la performance, même si elle peut sembler minime.
Pour illustrer ce qui se passe, je vais créer un array qui contient 1 million de valeurs et je vais créer une boucle vide qui fera l'itération sur chaque indice. Ceci nous permettra de vérifier le temps d'exécution avant et après l'optimisation. Pour calculer ce temps, je vais utiliser une astuce qui consiste à obtenir le temps microtime() avant et immédiatement après la boucle.
// générer 1 million d'enregistrementsAvec le count() dans la condition, j'obtiens un résultat de 0.5964 secondes.
$arr = range(1, 1000000);
// obtenir le temps de départ
$start = (float) array_sum(explode(' ',microtime()));
// boucle vide
for($i=0 ; $i < count($arr); $i++){
// on ne fait rien ici...
}
// obtenir le temps de fin
$end = (float) array_sum(explode(' ',microtime()));
// imprimer à l'écran la différence
echo sprintf("%.4f", $end-$start) . " secondes";
Maintenant, appliquons un changement mineur. Après avoir généré l'array initial, on peut compter une seule fois le nombre d'éléments dans l'array :
$arr = range(1, 1000000);Ensuite on remplace la condition de bris de la boucle pour utiliser la variable :
$count = count($arr);
for($i=0 ; $i < $count ; $i++)On exécute le script à nouveau. Le résultat : 0.1835 secondes, soit 3 fois plus rapide (dans le cas de mon ordinateur personnel). C'est certain que si vous avez un tableau de petite taille, ça ne fera pas une grande différence mais elle sera notable dès que le nombre d'itérations sera élevé.
Dans ce cas-ci, mon exemple était en PHP mais ça vaut aussi pour tous les autres langages. Faites-le par principe pour conserver les meilleures pratiques en tout temps.
Salut,
Plutôt que :
$start = (float) array_sum(explode(' ',microtime()));
Tu peux tout simplement passer 'true' à microtime pour récupérer sa valeur en float si tu bosses avec PHP5 :
$start = microtime(true);
Comme ça, en plus d'optimiser ta boucle, tu optimises aussi le chrono (et y'a des chances que ça te fasse gagner quelques millièmes, c'est toujours ça de pris).
;)