8
votes

Pour boucle ou en boucle - efficacité

Ceci peut être une question stupide, mais comment l'efficacité d'une boucle de temps se compare-t-elle à celle d'une boucle? J'ai toujours appris que si vous pouvez utiliser A pour boucle, alors je devrais. Mais quelle est la différence entre: xxx

comparer à: xxx

Je sais dans ces exemples spécifiques La différence est comme .000000001% , mais quand on parle de grandes boucles complexes, quelle est la différence?


2 commentaires

Vous devriez ajouter une étiquette, dire quelle langue c'est. Cela ressemble à c mais l'echo "raconte autre chose.


Le code est écrit en PHP (mais j'ai oublié les variables de $ avant les variables. À la hâte: p), mais la question était censée être pour la programmation générale. Cela ressemblerait aux réponses ci-dessous qu'il n'y a pas de différence exacte, cependant.


8 Réponses :


2
votes

Cela dépendra légèrement de la langue, éventuellement, et peut-être sur le compilateur, mais la plupart des compilateurs modernes les traiteront comme exactement identiques et il n'y aura aucune différence.


0 commentaires

4
votes

Cela dépend du compilateur exact que vous utilisez. Dans votre exemple, un bon compilateur créera le même code de machine pour les deux options.


0 commentaires

1
votes

Pensez à la principale différence comme style: avec un pour boucle, vous ne devez pas rechercher la valeur initiale, le seuil et l'incrémentation.

Il est également beaucoup plus facile de faire une boucle infinie d'un pendant parce que vous avez oublié d'incrémenter.


0 commentaires

12
votes

Je pense que vous dessinez la mauvaise conclusion des conseils que vous avez reçus.

la raison (dans ce cas au moins) préférer le pour construire sur le pendant n'a rien à voir avec l'efficacité; Il s'agit de tout le code d'écriture qui exprime vos intentions de manière claire et facile à comprendre.

Le pour place la condition initiale, l'incrément et la sortie de sortie tout au même endroit, ce qui facilite la compréhension. Le pendant que la boucle les étends. Par exemple, dans votre échantillon, quelle est la valeur initiale de i? -Oh, tu as oublié de le préciser? - C'est le point.


1 commentaires

+1; Je pense que vous avez résumé toutes les réponses les plus succinctement; Vous auriez dû obtenir la "réponse".



1
votes

Eh bien, si la boucle est grande et complexe, cela ne comportera pas depuis la surcharge du code de boucle (pour ou tandis que) sera très bas ...

Quoi qu'il en soit, si vous voulez vraiment savoir, je suppose que c'est à vous de vérifier votre IDE, dans le code de montage. Ou vous pouvez utiliser une dissible pour vous regarder dans un exécutable. http://www.caesum.com/files/borg228.zip (AVERTISSEMENT: Il y a généralement beaucoup de gonflement dans .exe, si bonne chance!)


1 commentaires

Mesure le. Même le code de montage ne vous dira pas ce que le processeur a réellement fait avec elle ...



3
votes

Comme vous pouvez deviner la plupart de ces réponses, le principal avantage d'A pour boucle pendant une boucle tandis que la boucle est la lisibilité. A pour la boucle est beaucoup plus propre et beaucoup plus agréable à regarder. Il est également beaucoup plus facile de rester coincé dans une boucle infinie avec une boucle de temps. Je dirais que je suis d'accord avec vos enseignements que si vous pouvez utiliser A pour une boucle, vous devriez, aussi longtemps que vous vous en tenir à cela, vos expériences de programmation seront beaucoup plus agréables.


0 commentaires

3
votes

La différence de performance entre pour boucle et tandis que la boucle n'est pas un gros problème car les compilateurs modernes peuvent générer le même code de machine pour les deux boucles et deuxièmement, les deux boucles nécessitent les mêmes opérations:

  1. Initialisation de la variable de comptoir.
  2. Etat de test.
  3. incrément / décrément de variable de comptoir.

    En général, vous devez utiliser pour boucle dans votre code pour les raisons suivantes:

    1. Pour augmenter la lisibilité de votre code.
    2. Pour améliorer la maintenabilité de votre code puisque les trois parties majeures d'une boucle I.E. L'initialisation, l'incrément / décrément et la condition de test sont écrites à la même ligne (dans la plupart des cas).
    3. Il limite la portée des variables de comptoir mieux qu'un tandis que la boucle , il aide donc une meilleure gestion de la mémoire.

      J'espère que cela a du sens et aiderait.


0 commentaires

1
votes

Comme mentionné dans toutes les réponses ici, tout compilateur décent compilerait les deux boucles dans le même code de la machine.

Votre code machine (prise de MIPS en tant que EX) serait un groupe de déclarations d'assemblage normales suivies d'une branche (Onequal / Notequal) dans les deux cas rendant votre efficacité cohérente.

Cependant, vous pouvez débattre sur le problème de style de codage ici (pas l'efficacité).

pour les boucles:

  1. utilisé lorsque vous savez exactement combien de fois la boucle va courir. L'étui de sortie est connu.
  2. sais par le montant par lequel votre boucle va augmenter par chaque itération

    * Utilisation probable: Lorsqu'une collection d'articles existe déjà et que vous souhaitez y remonter et récupérer le nombre de fois qu'une certaine propriété apparaît.

    tandis que les boucles:

    1. Vous n'êtes pas au courant de combien de fois la boucle va courir. Il existe un cas de sortie qui est défini / atteint pendant le moment où la boucle est en cours d'exécution (si vous souhaitez simuler une boucle, vous utiliserez quelque chose comme un compteur (code supplémentaire))

    2. Je ne sais pas à quel point votre boucle va augmenter. Votre incrément / prochain mouvement peut être réglé de manière dynamique. Bien que vous puissiez le faire dans A pour boucle, vous devrez rendre compte de l'incrément à chaque itération, ce qui entraîne un code illisible qui peut être évité lorsque vous utilisez une boucle tandis que si vous utilisez une boucle.

      * Utilisation probable: grepping un flux pour certaines données. Vous ne savez pas combien de temps le flux est donc votre cas de sortie lorsque le flux se termine. Comme il s'agit d'un flux et que vous obtiendrez peut-être une ligne de données par ligne, vous voudrez peut-être sauter sur des lignes blanches tout à fait rendant vos incréments non cohérents.


0 commentaires