1

Quels sont les problèmes de performances liés à l'utilisation de la boucle while v/s foreach/for loop ou inversement?Existe-t-il un problème de performance lié à l'utilisation de la boucle while vs foreach/for loop?

Est-il toujours préférable d'utiliser foreach loop v/s en php?

+8

presque certainement négligeable par rapport à ce qui est dans le corps de la boucle .... –

+2

pas c'est question n'est pas intéressante et valable d'un point de vue théorique, mais Pratique, toute différence de performance que vous remarquerez entre eux ne sera pas la cause première d'un ralentissement. –

+0

D'un autre côté, rendre cette langue agnostique rend un peu difficile à répondre à cause de la façon différente pour et pour chaque travail dans différentes langues. –

Répondre

5

Vous l'avez répertorié comme "indépendant de la langue", mais la réponse sera spécifique à la langue (ou, plutôt, au compilateur). En théorie, foreach peut être aussi rapide, sinon plus rapide, surtout si la boucle régulière for continue à faire une opération coûteuse pour tester le compte.

En outre, foreach fonctionne pour une collection paresseuse, une boucle for régulière doit connaître le nombre d'élément à l'avance.

Enfin, même si foreach est un peu plus lent sur votre plate-forme, il est la différence très improbable importera, et il est beaucoup plus maintenable qu'une boucle for. Ne pas optimiser prématurément. (Ce fut d'ailleurs le cas pour .NET pour tout, ils ont depuis rangèrent les performances des agents recenseurs.)

+0

une boucle 'for' n'a pas besoin de connaître la taille à l'avance – warren

+1

@warren: une boucle' for' de style C que vous voulez dire. C'est pourquoi le langage agnostique n'aide pas du tout ici. –

+0

de nombreux styles de boucle for n'ont pas besoin de savoir - et tout le monde que j'ai jamais vu peut être brisé de quelque manière, de sorte qu'il n'est pas trop difficile de le rendre flexible – warren

2

Hypothétiquement, un foreachpeut être plus lent - une boucle for et une boucle while avec le même la condition devrait être équivalente.

foreach doit passer par la structure de données à portée de main, donc quelle que soit la recherche de la structure pour le prochain (et le maintien de l'état) peut vous ralentir.

Cependant, si vous le faites manuellement dans une boucle for ou while, c'est probablement la même chose. La meilleure réponse, bien sûr, est de l'essayer et de le chronométrer pour voir quelle est la réponse.

0

Réponse courte: non. Ce n'est pas une chose utile de gaspiller même une seule pensée.

0

J'ai écrit un article pour php | architect sur le même problème de bouclage en PHP. Fondamentalement, les benchmarks montrent, qu'il n'y a pas d'impact significatif de la surcharge en boucle ... même en utilisant mon extension de plage numérique paresseux. IIRC, foreach est 2.9x plus lent qu'une boucle for, une fois que vous excluez la mémoire et les coûts des fonctions du générateur. Si le contenu de votre boucle est inférieur à 2,9 fois la charge de la boucle, vous pouvez alors reconsidérer ce que vous faites.

En outre, si vous cherchez des performances de boucle brutes dans une langue, PHP devrait être sur votre liste des derniers choix absolus. Il est interprété et, séparément, pas bien adapté pour les opérations de longue durée.

La plupart des codeurs PHP gaspillent d'innombrables cycles de concaténation de chaînes. Cela parle aux avertissements d'optimisation prématurés. Je parie que je peux doubler votre performance simplement en ajoutant des virgules à vos déclarations "echo".

Affirmez votre code avec XDebug ou quelque chose. Trouvez votre réel goulots d'étranglement. Looping n'est-ce pas. Croyez-moi. Ça ne l'est jamais.

2

Je sais que ce ans, mais je dois signaler quelque chose pour l'avenir Googlers:

« foreach » nécessite les données que vous tirez de à être chargé et complet - par exemple, le tableau que vous feriez boucle sera déjà en mémoire. "While" ne nécessite qu'une seule valeur (peut être data ou false - que ce soit la poursuite de la boucle).

Programmation correcte de votre boucle, une boucle while doit seulement avoir la valeur suivante chargée par opposition à un ensemble de données entier. Donc, si vous deviez programmer la boucle while pour tirer ses données d'une fonction, vous pouvez réduire considérablement l'utilisation de la mémoire. Un exemple peut être l'itération à travers chaque ligne d'une grande base de données million-row; en utilisant foreach vous devrez charger l'ensemble de données entier pour effectuer la boucle, qui mangerait votre mémoire vivante. mais en utilisant une fonction qui tire seulement la ligne suivante nécessaire, vous compléteriez la boucle avec succès.

le ci-dessous explique pseudocode:

function nextrow() 
{ 
    static myquery = sql_query('SELECT * FROM `hugetable`') 
    return(next_row(myquery)); 
} 
while(row = nextrow()) { ...do stuff... }