crocejf2000
Messages postés260Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention27 août 20081 25 févr. 2003 à 11:24
Salut,
Il y a quelque temps, je me posait la meme question que toi, voici une réponse que l'on m'a renvoyé :
De mémoire, du temps ou l'optimisation était un coucours permament de potache le while est plus
rapide, si et seulement si tu décrément en dernier instruction.
Le plus lent
for (int i=0; i<50; i++)
{
}
Vitesse moyenne
int i=50;
do
{
i--;
}
while (i!=0)
Le plus rapide
int i=50;
while (i)
{
.. code ..
i--;
}
Mais bon, c'est sur des compilateurs de 1990, depuis le temps les optimisations ont certainement
évolué.
Le mieux est de comparer le code assembleur générer.
; 17 : int total2=0;
0001a 33 c9 xor ecx, ecx
; 18 : for (int i2=50;i2;i2--)
0001c b8 32 00 00 00 mov eax, 50 ; 00000032H
$L9630:
; 19 : total2+=i2;
00021 03 c8 add ecx, eax
00023 48 dec eax
00024 75 fb jne SHORT $L9630
Et bien le for génére le même code.
Les optimisateurs font bien leur travail.
Par contre si tu fais une boucle
for (int i2=0;i2<50;i2++) tu vas moins vite
Le for est définitivement plus clair et plus concis. Plus efficace? Pas du côté de la vitesse, mais un peu du côté 'organisation'. Dans le for, la variable 'j' est locale à la boucle, c'est-à-dire qu'elle n'existe qu'entre les deux accolades, contrairement au while.
Mais à part ça, on peut habituellement faire la même chose avec les deux, mais de façon différente. Lequel choisir dépend du contexte et de ce que tu veux faire. Pour une simple variable compteur, tu préféreras le for au while (comme on a vu). Pour une boucle sans fin, le while(true) à la place de for(;;). Pour une condition simple, le while(condition) au for(;condition), et ainsi de suite.
Mais souviens toi, il n'y a, en général, pas de différence de vitesse entre les deux.
D'après moi, même, il n'y en a aucune, car les optimiseurs font du très bon travail, mais je garde le 'en général' comme porte de sortie :)