Accueil > Développement > Programmation > Optimisation : les boucles

Optimisation : les boucles

Bien connaître la vitesse d’exécution d’un code pour bien optimiser.

lundi 20 février 2006, par Prélude

Savez-vous si une boucle FOR est plus rapide qu’une boucle WHILE ?! On s’est posé la question et nous avons fait des tests, voici les résultats !

Dans les exemples qui vont suivre, chaque boucle a été codée sur la même machine et les tests ont été réalisé un millier de fois pour obtenir une moyenne.

Une boucle de test calibrée nous permet de valider ou non un test (cas ou la machine subirait une quelconque lenteur).

Boucles FOR contre Boucle WHILE

Lorsque l’on a le choix entre boucle for ou while, il est interressant de voir si le choix a réellement un impact sur la vitesse d’exécution du code.

for($i=0;$i<500000;$i++) {
        $p = $p + 1;
}

Temps moyen : 0.140 s

$i = 0;
while($i<500000) {
        $p = $p + 1;
        $i++;
}

Temps moyen : 0.138 s

Pas de différence notable donc.
Si vous avez le choix, tout est question de goût au final. Notez tout de même un point important lorsque vous programmez une boucle : le test de fin doit porter, si possible, non pas sur une égalité, mais plutôt sur un test de dépassement. Question de sécurité. Il est donc préférable d’écrire $i<500000 que $i==500000.

Continuons un peu pour pousser les tests plus loin. Nous allons changer juste le principe d’incrémentation de notre boucle :

for($i=0;$i<500000;++$i) {
        $p = $p + 1;
}

Temps moyen : 0.128 s

Il y a une différence ! Qu’est-ce que l’on a changé ? Juste l’incrémentation du compteur. Le compteur est désormais en "Pré-incrémentation" (devant) au lieu de la "Post-incrémentation" (après).
En effet, la pré-incrémentation est plus rapide. Bon, faut pas crier victoire, le gain est très légé, voir innexploitable. Mais si toutefois vous avez de longs, très longs calculs à faire, vous aurez une petite solution d’optimisation.

Voyons avec la boucle while maintenant :

$i = 0;
while($i<500000) {
        $p = $p + 1;
        ++$i;
}

Temps moyen : 0.121 s

On gagne encore un peu en temps d’exécution.

Au passage, le fait de rajouter des commentaires dans la boucle ne change rien. Que ce soit des commentaires classique "//" ou des commentaires de type C "/* */".

Nous continuerons ces tests de vitesse dans de prochains articles avec, notamment, des tests effectués sur des bases de données.