Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist effizienter, for oder foreach? Warum?

Was ist effizienter, for oder foreach? Warum?

藏色散人
藏色散人nach vorne
2020-06-13 14:57:385512Durchsuche

Der Grund für das Schreiben dieses Artikels liegt hauptsächlich darin, dass ich während des Entwicklungsprozesses plötzlich die folgenden Fragen hatte und mir die Zeit nahm, sie eingehend zu untersuchen, um mein Verständnis von PHP zu vertiefen.

1. Als PHP-Programm werden For- und Foreach-Schleifendurchläufe fast täglich verwendet. Welche dieser beiden Durchlaufmethoden ist also effizienter?

2. Was ist der Grund für hohe Effizienz?

3. Was sind die Grundsätze?

Zunächst müssen wir das erste Problem lösen. Wir können uns die Testergebnisse durch einen einfachen Test ansehen. Der Testcode lautet wie folgt:

for-Schleife Durchlaufmethode:

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;;
}

Foreach-Schleifendurchlaufmethode:

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;
}

Zeitberechnungsmethode:

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

Sehen Sie sich den Zeitverbrauch der beiden an Methoden

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

Aus dem oben Gesagten können wir eindeutig zwei Schlussfolgerungen aus dem Test ziehen:

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

Also die zweite Frage: Was ist der Grund für die hohe Effizienz? Bevor wir nach dieser Antwort suchen, besprechen wir zunächst die dritte Frage. Werfen wir einen Blick auf die Prinzipien.

for-Schleife:

Jedes Mal, wenn sie bei $i beginnt, muss jede Schleife bestimmen, ob $i kleiner als count ist, was viel Zeit in Anspruch nimmt

Weniger als fortfahren, sonst Schleife beenden

foreach:

foreach 依赖 IEnumerable.
第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,
以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.
期间GetList()方法只执行一次.
从上面是分析我们明显可以得出结论:php 的foreach循环效率是大大高于for循环。

ABER: Ist das wirklich so? Manche Leute würden sagen, dass dieses Beispiel bereits offensichtlich ist und die Schlussfolgerung auf den ersten Blick klar ist. Gibt es andere Möglichkeiten?

Ich denke, die Wahrheit ist nicht so einfach. Wenn das wirklich der Fall ist, was bedeutet die for-Schleife?

Wäre es nicht ausreichend, nur foreach zu verwenden, da foreach um ein Vielfaches effizienter ist als for? Persönlich bin ich der Meinung, dass das von mir getestete Beispiel gewisse Einschränkungen aufweist und nicht als absolute Grundlage für die Bewertung der Effizienz der beiden Schleifenmethoden verwendet werden kann.

Für unsere PHPer ist es jedoch besser, bei der normalen Arbeit die Foreach-Schleifendurchquerung zu verwenden. Wenn Sie interessiert sind, können Sie dies nicht tun Studieren Sie es gründlich.

Das Folgende ist die Antwort von Internetnutzern:

Die Bedeutung von for existiert, weil es einige Situationen gibt, in denen foreach schwierig zu implementieren ist. Weitere Informationen finden Sie im Artikel 46 von Effective Java Obwohl Sie PHP verwenden, sind sie im Grunde gleich! Das Buch empfiehlt die Verwendung des foreach-Modus, aber es gibt drei Situationen, in denen er ungeeignet ist: 1. Filtern – Wenn Sie die Sammlung durchlaufen und ausgewählte Elemente entfernen müssen, müssen Sie eine explizite Iteration verwenden und deren Methode zum Entfernen aufrufen. 2. Konvertierung – Wenn Sie eine Liste oder ein Array durchlaufen und einige oder alle Elementwerte ersetzen müssen, benötigen Sie einen Iterator der Liste oder einen Index des Arrays, um diese Werte festzulegen. 3. Parallele Iteration – Wenn Sie mehrere Sammlungen parallel durchlaufen müssen, müssen Sie den Iterator oder die Indexvariable explizit steuern, damit alle Iteratoren oder Indizes gemeinsam vorrücken können. Dann scheinen for und foreach unterschiedliche Daten zu durchlaufen Es gibt verschiedene Leistungsunterschiede, wie z. B. verknüpfte Listen oder Arrays. Darüber habe ich mich in letzter Zeit gewundert.

Verwandte Empfehlungen: „PHP-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist effizienter, for oder foreach? Warum?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen