Qu'est-ce qui est le plus efficace, pour ou pour chaque ? Pourquoi?

藏色散人
Libérer: 2023-04-08 21:24:01
avant
5656 Les gens l'ont consulté

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 &#39;for循环遍历耗时:&#39;.$for_Time.&#39;<br>&#39;;
}
Copier après la connexion

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 &#39;foreach循环遍历耗时:&#39;.$foreach_Time;
}
Copier après la connexion

Méthode de calcul du temps :

/**
 *  时间统计函数
 */
private function microtime_float($time = null)
{
   list($usec, $sec) = explode(&#39; &#39;, $time ? $time : microtime());
   return ((float)$usec + (float)$sec);
}
Copier après la connexion

Regardez la consommation de temps des deux méthodes

/*
 * 输出结果:第一种情况:先count在for循环遍历耗时:0.028002023696899 秒
 *                         foreach循环遍历耗时:0.003000020980835 秒
 *        第二种情况:在for循环条件中做count遍历耗时:0.095005035400391 秒
 *                            foreach循环遍历耗时:0.0040009021759033 秒
 * */
Copier après la connexion

De ce qui précède Nous pouvons clairement tirer deux conclusions du test :

1、for循环遍历的效率是低于foreach循环遍历
2、for循环在外部做count和在条件中做count相比较,第一种效率更高
Copier après la connexion

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循环。
Copier après la connexion

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal