2011-04-01 3 views
1

Je voudrais savoir Quelle est la meilleure façon d'écrire des boucles?Quelle est la meilleure façon d'écrire des boucles?

Est-ce que Count Down_to_Zero Loop est meilleur que Count_Up_Loops? Et en particulier dans le contexte Embedded Systems dont on est le meilleur choix ???

+1

Même si c'était le cas, cela serait spécifique au processeur utilisé. –

Répondre

9

Dans le monde de l'embarqué, il peut être préférable d'utiliser un système de préférence à une autre dépend du processeur que vous utilisez. Par exemple le processeur PIC a une instruction "décrémenter et sauter sinon zéro". C'est vraiment bon pour faire un compte à rebours "pour" boucle dans une seule instruction.

D'autres processeurs ont des jeux d'instructions différents, donc des règles différentes s'appliquent.

Vous pouvez également avoir à prendre en compte les effets de l'optimisation du compilateur qui peut convertir un compte dans la version à décompte éventuellement plus efficace.

Comme toujours, si vous avez à vous soucier de ces choses, alors vous utilisez le mauvais processeur et les outils. L'idée d'écrire dans un langage de plus haut niveau que l'assembleur est d'expliquer à l'ingénieur de maintenance comment le logiciel fonctionne. S'il est contre-intuitif d'utiliser une boucle de compte à rebours, ne le faites pas, quelle que soit la perte (mineure) d'efficacité du processeur.

+0

Si nous utilisons count Down to Zero boucles à la fin de la boucle, la comparaison à zéro peut être optimisée par le complicateur –

+2

Si vous regardez le code généré par le compilateur, j'ai vu des compteurs de boucle décrémentés pour les boucles count-up exactement pour cette raison. Comme je l'ai dit dans ma réponse, si vous devez micro-optimiser votre code et devinez votre compilateur alors vous utilisez le mauvais processeur et les outils. Si une ou deux instructions supplémentaires dans votre boucle sont critiques alors vous avez de vrais problèmes –

+0

@AMIT Le compilateur devrait être capable de comprendre cette optimisation sans aide du programmeur. – Lundin

3

C'est votre préférence personnelle. Dans le cas des tableaux, compter à partir de 0 est généralement préférable car vous voulez généralement traiter chaque valeur dans l'ordre. Aucun style n'est intrinsèquement meilleur, mais ils peuvent avoir des résultats différents (par exemple, si vous imprimez chaque valeur dans un tableau, l'ordre de la sortie sera différent).

Dans de nombreux cas (à l'exception notable des tableaux), le choix le plus logique est d'utiliser une boucle while plutôt qu'une boucle for, par exemple la lecture d'un fichier:

int c; 
while ((c = fgetc(somefile)) != EOF) 
    /* Do something */ 
3

Ce qui vous inquiète le plus, c'est que vous, ou quelqu'un d'autre, liriez le code dans le futur, et que la personne devrait être capable de comprendre ce que le code est censé faire. En d'autres termes, écrivez votre code en texte brut. Si vous avez l'intention de faire quelque chose dix fois, bouclez de 0 à moins de 10. Si vous avez l'intention de revenir en arrière dans un tableau, passez de la valeur la plus élevée à la valeur la plus basse.

Évitez de placer tout ce qui n'est pas lié au contrôle de la boucle dans l'en-tête de l'instruction for.

En matière d'efficacité, vous pouvez laisser cela en toute sécurité au compilateur.

2

La meilleure façon d'écrire une boucle est:

for(i=0; i<N; i++) 
    for(j=0; j<N; j++) 
    { 
    array[i][j] = ... ; 
    } 

Tout le reste est « optimisations prématurées », à savoir des choses que le compilateur devrait vraiment être capable de gérer pour vous. Cependant, si vous avez un compilateur bête, il peut être plus efficace de compter de N à zéro, car la comparaison avec zéro est plus rapide que la comparaison avec la valeur sur la plupart des processeurs.

Notez que N devrait être une expression constante si possible. Laissez les appels de fonction comme strlen() etc de la comparaison de boucle.

++ Je serai également plus rapide si le code peut aboutir à un compilateur C++, où le standard C++ garantit que ++ i est plus rapide que i ++, car i ++ crée une variable invisible temporaire. L'ordre de la boucle devrait être juste comme ci-dessus pour la plupart des systèmes, car c'est souvent le moyen le plus efficace d'adresser les mémoires caches, ce qui est un sujet assez avancé. Qu'aurait-il à voir avec les systèmes embarqués?

Questions connexes