Question

for (i=0 ; i<=10; i++)
{
    ..
    ..
}

i=0;
while(i<=10)
{
    ..
    ..
    i++;
}

et en boucle, ce qui est mieux, performances?

Était-ce utile?

La solution

(mise à jour) En fait - il y a un scénario dans lequel la construction de for est plus efficace; une boucle sur un tableau. Le compilateur / JIT a pour ce scénario Optimisations aussi longtemps que vous utilisez arr.Length dans l'état :

for(int i = 0 ; i < arr.Length ; i++) {
    Console.WriteLine(arr[i]); // skips bounds check
}

Dans ce cas très précis, il permet de sauter la vérification des limites, car il sait déjà qu'il ne sera jamais hors limites. Fait intéressant, si vous « palan » arr.Length d'essayer de l'optimiser, vous empêchez manuellement ceci de se produire:

int len = arr.Length;
for(int i = 0 ; i < len ; i++) {
    Console.WriteLine(arr[i]); // performs bounds check
}

Cependant, avec d'autres conteneurs (List<T> etc), levage est assez raisonnable en tant que micro-optimisation manuelle.

(mise à jour de fin)


Ni; une boucle est évaluée comme une boucle while sous le capot de toute façon.

Par exemple 12.3.3.9 de ECMA 334 (affectation définitive) dicte qu'une boucle:

for ( for-initializer ; for-condition ; for-iterator ) embedded-statement

est essentiellement équivalent (d'un Affectation Definite perspective (pas tout à fait la même chose que dire "le compilateur doit générer cette IL")) comme:

{
    for-initializer ;
    while ( for-condition ) {
        embedded-statement ;
        LLoop:
        for-iterator ;
    }
}
  

continue des déclarations qui visent   pour la déclaration en cours de traduction à   déclarations goto ciblant l'étiquette   Lloop. Si l'on omet de condition   de la déclaration pour, puis   évaluation de l'affectation définitive   produit comme pour condition étaient   remplacé par vrai dans ce qui précède   expansion.

Maintenant, cela ne signifie pas que le compilateur doit faire exactement la même chose, mais en réalité il fait à peu près ...

Autres conseils

Je dirais que ce sont les mêmes et vous ne devriez jamais faire ces micro-optimisations de toute façon.

La performance sera le même. Cependant, à moins que vous devez accéder à la variable i en dehors de la boucle, vous devez utiliser la boucle de for. Ce sera plus propre puisque i n'aura portée à l'intérieur du bloc.

L'efficacité du programme provient d'algorithmes appropriés, une bonne conception de l'objet, l'architecture de programme intelligent, etc.

Le rasage d'un cycle ou deux avec des boucles vs while ne fera jamais un programme lent rapide, ou un programme rapide lent.

Si vous souhaitez améliorer les performances du programme dans cette section, trouver un moyen de partiellement déroulez la boucle (voir périphérique de Duff ), ou d'améliorer les performances de ce qui se fait dans la boucle.

Ni l'un. Ils sont équivalents. Vous pouvez penser à la boucle « pour » être d'une manière plus compacte d'écrire la boucle while.

Oui, ils sont extraits de code équivalent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top