La raison pour laquelle j'ai écrit cet article est principalement parce que je me suis soudainement posé les questions suivantes pendant le processus de développement. J'ai pris le temps de les explorer en profondeur pour approfondir ma compréhension de PHP.
1. En tant que PHPer, les parcours de boucles for et foreach sont utilisés presque tous les jours, alors laquelle de ces deux méthodes de parcours est la plus efficace ?
2. Quelle est la raison d’une efficacité élevée ?
3. Quels sont les principes ?
Tout d'abord, nous devons résoudre le premier problème. Nous pouvons jeter un œil aux résultats du test à travers un simple test. Le code du test est le suivant :
boucle for. méthode de parcours :
public function getForTime(){ $big_Array = range(0,1000000,1); /* for循环遍历数组示例 */ $start_For_Time = $this->microtime_float(); //$array_Count = count($big_Array); for ($i=0;$i<count($big_Array);$i++) { $i; } $end_For_Time = $this->microtime_float(); $for_Time = $end_For_Time - $start_For_Time; echo 'for循环遍历耗时:'.$for_Time.'<br>'; }
méthode de parcours de boucle foreach :
public function getForeachTime(){ $big_Array = range(0,1000000,1); /* foreach循环遍历数组示例 */ $start_Foreach_Time = $this->microtime_float(); foreach ($big_Array as $key=>$val) { $key; } $end_Foreach_Time = $this->microtime_float(); $foreach_Time = $end_Foreach_Time - $start_Foreach_Time; echo 'foreach循环遍历耗时:'.$foreach_Time; }
Méthode de calcul du temps :
/** * 时间统计函数 */ private function microtime_float($time = null) { list($usec, $sec) = explode(' ', $time ? $time : microtime()); return ((float)$usec + (float)$sec); }
Regardez la consommation de temps des deux méthodes
/* * 输出结果:第一种情况:先count在for循环遍历耗时:0.028002023696899 秒 * foreach循环遍历耗时:0.003000020980835 秒 * 第二种情况:在for循环条件中做count遍历耗时:0.095005035400391 秒 * foreach循环遍历耗时:0.0040009021759033 秒 * */
De ce qui précède Nous pouvons clairement tirer deux conclusions du test :
1、for循环遍历的效率是低于foreach循环遍历 2、for循环在外部做count和在条件中做count相比较,第一种效率更高
Donc la deuxième question : quelle est la raison d'une efficacité élevée ? Avant de chercher cette réponse, discutons d’abord de la troisième question. Voyons quels sont les principes.
boucle for :
Chaque fois qu'elle commence à partir de $i, chaque boucle doit déterminer si $i est inférieur à count, ce qui prend beaucoup de temps
Moins de continuer, sinon terminer la boucle
foreach :
foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束. 期间GetList()方法只执行一次. 从上面是分析我们明显可以得出结论:php 的foreach循环效率是大大高于for循环。
MAIS : Est-ce vraiment le cas ? Certains diraient que cet exemple est déjà très évident et que la conclusion est claire en un coup d'œil. Existe-t-il d'autres possibilités ?
Je pense que la vérité n'est pas si simple. Si c'est vraiment le cas, quelle est la signification de la boucle for ?
Puisque foreach est bien plus efficace que for, ne suffirait-il pas d'utiliser simplement foreach ? Personnellement, j'estime que l'exemple que j'ai testé présente certaines limites et ne peut pas être utilisé comme base absolue pour évaluer l'efficacité des deux méthodes de boucle.
Cependant, pour nos PHPers, il est préférable d'utiliser le parcours de boucle foreach dans le travail normal. Quant au fonctionnement de la couche de compilation, il n'est pas nécessaire d'entrer dans trop de détails. Si vous êtes intéressé, vous pouvez. étudiez-le en profondeur.
Voici la réponse des internautes :
La signification de for existe car il existe certaines situations où foreach est difficile à mettre en œuvre. Pour plus de détails, vous pouvez consulter l'article. 46 de Effective Java Bien que vous utilisiez du PHP, ils sont fondamentalement les mêmes ! Le livre recommande d'utiliser le mode foreach, mais il existe trois situations dans lesquelles il est inapproprié : 1. Filtrage - Si vous devez parcourir la collection et supprimer les éléments sélectionnés, vous devez utiliser une itération explicite et appeler sa méthode Remove. 2. Conversion - Si vous devez parcourir une liste ou un tableau et remplacer tout ou partie des valeurs des éléments, vous avez besoin d'un itérateur de la liste ou d'un index du tableau pour définir ces valeurs. 3. Itération parallèle - Si vous devez parcourir plusieurs collections en parallèle, vous devez contrôler explicitement l'itérateur ou la variable d'index afin que tous les itérateurs ou index puissent avancer ensemble. Ensuite, for et foreach semblent parcourir des données différentes en termes de performances. Il existe des différences de performances différentes, telles que des listes chaînées ou des tableaux. C'est quelque chose que je me suis posé récemment.
Recommandations associées : "Tutoriel PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!