Quelle est la différence entre for et while en Csharp ?

Grande question que la différence entre for et while en Csharp !

On peut tout d’abord parler de la différence sur le principe d’itération : avec for, on déclare l’index d’itération ainsi que la condition d’arrêt tandis que le while ne fait que contrôler la condition d’arrêt de l’itération.

Temps d’exécution

Prenons les exemples suivants :

Note : la liste people est constituée de 20 000 000 string.

Boucle for :

for (int i = 0; i < people.Count; i++)
{
    var test = people[i];
}

Boucle while :

int y = 0;
while (y < people.Count)
{
    var test = people[y];
    y++;
}

À l’exécution, les temps constatés sont très similaires :

  • For : 143 ms ;
  • While : 141 ms.

Code assembleur

Nous venons de voir qu’il n’y a pratiquement pas de différence de temps de traitement entre les deux implémentations. Penchons-nous sur le code désassemblé pour voir s’il existe une différence sur le code compilé par msbuild :

Boucle for :

inc         dword ptr [ebp-48h]
mov         eax,dword ptr [ebp-48h]
mov         dword ptr [ebp-74h],eax
mov         ecx,dword ptr [ebp-44h]
cmp         dword ptr [ecx],ecx
call        6F37BDD0
mov         dword ptr [ebp-78h],eax
mov         eax,dword ptr [ebp-74h]
cmp         eax,dword ptr [ebp-78h]
setl        al
movzx       eax,al
mov         dword ptr [ebp-54h],eax
cmp         dword ptr [ebp-54h],0
jne         00E82B37

Boucle while :

mov         eax,dword ptr [ebp-54h]
mov         dword ptr [ebp-8Ch],eax
mov         ecx,dword ptr [ebp-48h]
cmp         dword ptr [ecx],ecx
call        6F37BDD0
mov         dword ptr [ebp-90h],eax
mov         eax,dword ptr [ebp-8Ch]
cmp         eax,dword ptr [ebp-90h]
setl        al
movzx       eax,al
mov         dword ptr [ebp-5Ch],eax
cmp         dword ptr [ebp-5Ch],0
jne         00422BC9

Différentiel :

+inc         dword ptr [ebp-48h]
 mov         eax,dword ptr [ebp-48h]
 mov         dword ptr [ebp-74h],eax
 mov         ecx,dword ptr [ebp-44h]

Comme on peut le constater, la seule différence concerne l’instruction inc dword ptr [ebp-48h] présente uniquement pour le for et qui correspond à l’instanciation de la variable d’itération.

Dans le cas du while, l’instanciation est bien présente mais elle ne fait pas partie de la boucle d’itération à proprement parler.

Conclusion

Les deux solutions étant techniquement identiques, pourquoi utiliser l’une plutôt que l’autre ? La réponse à cette question tout à fait subjective : quelle est la plus lisible ou laquelle préfère-t-on ?

Lorsqu’un tel choix se présente, il est primordial de prendre en compte les affinités de chacun des membres de votre équipe et de choisir la solution qui convient le mieux à tout le monde.

En ce qui nous concerne, chez Tinci nous préférons le for car il contient l’ensemble des informations (itération et condition d’arrêt) sur la même ligne déclarative. Cela simplifie les modifications, limite le risque d’erreur et facilite la revue de code.

Nous allons même jusqu’à utiliser for (;;) équivalent d’une boucle while(true) afin de toujours garder la structure déclarative du for et facilité les futures modifications.

Et vous que préférez-vous ?

Publié le 15 juillet 2014

Notre vision des choses vous correspond ? Vous avez envie de travailler avec nous ?