Boucle For ou While - Efficacité
Cela peut être une question stupide, mais comment l'efficacité d'une boucle while comparer à celui d'une boucle for? J'ai toujours été enseigné que si vous peut utiliser une boucle for, alors que je devrais. Mais ce qu'est réellement la différence entre :
$i = 0;
while($i < 100) {
echo $i;
$i++;
}
comparer:
for($i = 0; $i < 100; $i++) {
echo $i;
}
Je sais que dans ces exemples, la différence est comme .000000001%, mais quand nous parlons des grandes boucles complexes, quelle est la différence?
Vous devez ajouter une balise, dire de quelle langue il s'agit. Il ressemble à C, mais les "echo" raconte quelque chose d'autre.
Le code est écrit en PHP(mais j'ai oublié le $ avant de variables.. pressé :P), mais la question était censé être pour la programmation en général. Il semblerait, d'après les réponses ci-dessous qu'il n'y a aucune différence, cependant.
Le code est écrit en PHP(mais j'ai oublié le $ avant de variables.. pressé :P), mais la question était censé être pour la programmation en général. Il semblerait, d'après les réponses ci-dessous qu'il n'y a aucune différence, cependant.
OriginalL'auteur jwegner | 2010-11-18
Vous devez vous connecter pour publier un commentaire.
Comme vous pouvez le deviner à partir de la plupart de ces réponses, le principal avantage d'une boucle sur une boucle while est la lisibilité. Une boucle for 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 while. Je dirais que je suis d'accord avec vos enseignements que si vous pouvez utiliser une boucle for, vous devez, donc, tant que vous vous en tenez à cela, votre expérience de programmation sera beaucoup plus agréable.
OriginalL'auteur Brendan
Je pense que vous êtes le dessin à la mauvaise conclusion de l'avis que vous avez été donné.
La raison (dans ce cas au moins) à préférer la
for
construire sur lewhile
n'a rien à voir avec efficacité; il est tout au sujet de l'écriture de code qui exprime vos intentions dans un style clair et facile à comprendre de manière.La
for
des lieux de la condition initiale, d'incrémentation et de sortie de la condition de tous dans un endroit, le rendant plus facile à comprendre. Lewhile
boucle se propage autour de lui. Par exemple, dans votre exemple, quelle est la valeur initiale de i? -oh, j'ai oublié de vous le préciser? --c'est le point.OriginalL'auteur David Gelhar
Qui repose sur le compilateur que vous utilisez. Dans votre exemple, un bon compilateur va créer le même code machine pour les deux options.
OriginalL'auteur Heinzi
La différence de performances entre
for loop
etwhile loop
n'est pas un gros problème parce que les compilateurs modernes peuvent même générer du code machine pour les deux boucles et d'autre part les deux boucles exiger mêmes opérations:En général, vous devez utiliser
for loop
dans votre code pour les raisons suivantes:while loop
, par conséquent, il contribue à une meilleure gestion de la mémoire.J'espère qu'un sens et pourrait l'aider.
OriginalL'auteur पवन
Il repose légèrement sur la langue, probablement, et peut-être sur le compilateur, mais la plupart les compilateurs modernes traitent comme exactement le même et il n'y aura pas de différence.
OriginalL'auteur The Archetypal Paul
Pense que la principale différence de style: avec un
for
boucle, vous n'avez pas à aller à la recherche de la valeur initiale, de seuil, et l'incrément.C'est aussi beaucoup plus facile de faire une boucle infinie d'un
while
parce que vous avez oublié d'incrémenter.OriginalL'auteur Brad
Bien, si la boucle est vaste et complexe, il n'a pas d'importance puisque la surcharge de la boucle de code
(ou pendant) sera très faible...
De toute façon, si vous voulez vraiment le savoir, je suppose que c'est à vous de vérifier dans votre ide,
dans le code assembleur. ou vous pouvez utiliser un dissembler de vous regarder dans un fichier exécutable.
http://www.caesum.com/files/borg228.zip
(avertissement: il y a généralement beaucoup de ballonnement .exe,alors bonne chance!)
OriginalL'auteur adfgadhj
Comme mentionné dans toutes les réponses ici, tout décent compilateur compiler les deux boucles dans le même code machine.
Votre code machine (prise de MIPS ex) serait un tas de normal de l'assemblée des états suivie par une branche (onequal/notequal) dans les deux cas, faire de votre efficacité cohérente.
Cependant, vous pourriez débat sur le style de codage question ici (Pas l'efficacité).
Pour Les Boucles :
*Probable d'Utilisation : Quand une collection d'éléments existe déjà et que vous voulez revenir et de récupérer le nombre de fois qu'une certaine propriété apparaît.
Tandis Que Les Boucles :
Vous n'êtes pas conscient de combien de fois la boucle va s'exécuter. Il y a une sortie de cas qui est défini/atteint quelque temps tandis que la boucle est en cours d'exécution (si vous voulez simuler une boucle for, vous devez utiliser quelque chose comme un compteur (code))
Ne sais pas combien de votre boucle va incrémenter par. Votre incrément/mouvement suivant peut être défini de façon dynamique. Alors que vous pouvez le faire dans une boucle for, vous aurez à rendre compte de l'incrémenter à chaque itération ainsi à l'origine de certains illisible code qui peut être évitée si vous utilisez une boucle while.
*Probable d'Utilisation : Grepping un flux de données pour certaines données. Vous n'êtes pas conscient de combien de temps le flux est donc de sortie est le cas lorsque le flux se termine. Puisque c'est un flux et vous pourriez être l'obtention de données ligne par ligne, vous pouvez sauter des lignes blanches complètement de faire votre incréments pas cohérent.
OriginalL'auteur The Platypus