Heim  >  Artikel  >  Backend-Entwicklung  >  Unterschiede und Leistungsvergleich zwischen foreach- und while-Schleifen

Unterschiede und Leistungsvergleich zwischen foreach- und while-Schleifen

伊谢尔伦
伊谢尔伦Original
2017-06-23 13:29:025781Durchsuche

foreach- und while-Schleife in PHP, was ist also der Unterschied zwischen foreach- und while-Schleife? Welcher hat eine bessere Leistung? .

In einer While-Schleife liest Perl eine Eingabezeile, speichert sie in einer Variablen und führt den Hauptteil der Schleife aus. Dann geht es zurück, um andere Eingabezeilen zu finden.

In der foreach-Schleife wird die gesamte Eingabezeile

Operator im Kontext der Liste ausgeführt (da foreach den Inhalt der Liste Zeile für Zeile verarbeiten muss). Bevor die Schleife ausgeführt werden kann, muss sie alle Eingaben lesen.

Bei der Eingabe von Dateien mit großer Kapazität belegt die Verwendung von foreach viel Speicher. Der Unterschied zwischen den beiden wird sehr offensichtlich sein. Daher besteht der beste Ansatz normalerweise darin, die Abkürzung für eine while-Schleife zu verwenden und sie jeweils eine Zeile verarbeiten zu lassen.

Wenn Sie bestimmte Anweisungen oder Absätze wiederholt ausführen möchten, bietet C# vier verschiedene Optionen für Schleifenanweisungen, die Sie je nach aktuellen Aufgaben verwenden können:

. für Aussage
. foreach-Anweisung
. while-Anweisung
. do-Anweisung

1. for

Die for-Anweisung ist besonders nützlich, wenn Sie im Voraus wissen, wie oft eine enthaltene Anweisung ausgeführt werden soll. Mit der regulären Syntax können innere Anweisungen (und Schleifen-

-Ausdrücke ) wiederholt ausgeführt werden, wenn die Bedingung wahr ist:

für (Initialisierung; Bedingung; Schleife) innere Anweisung

Beachten Sie Folgendes Initialisierung, Bedingungen und Schleifen sind alle optional. Wenn Sie die Bedingung weglassen, können Sie eine Endlosschleife erstellen, die zum Verlassen eine Sprunganweisung (break oder goto) erfordert.

for (;;)
{
   break; // 由于某些原因
}
Ein weiterer wichtiger Punkt ist, dass Sie allen drei Parametern der

for-Schleife mehrere durch Kommas getrennte Anweisungen gleichzeitig hinzufügen können. Sie können beispielsweise zwei Variablen initialisieren, drei Bedingungen festlegen und vier Variablen wiederholen.

2.foreach

Eine Funktion, die es in der Visual Basic-Sprache schon seit langem gibt, ist die Sammlung von Aufzählungen mithilfe der For Each-Anweisung. C# verfügt auch über einen Befehl zum Sammeln von Aufzählungen über die foreach-Anweisung:

foreach (Typbezeichner im Ausdruck) Die enthaltenen Schleifenvariablen der Anweisung

werden nach Typ und Bezeichner deklariert, und Ausdrücke entsprechen Sammlungen. Die Schleifenvariable stellt das Sammlungselement dar, für das die Schleife ausgeführt wird.

3.while

Wenn Sie eine eingeschlossene Anweisung 0 Mal oder öfter ausführen möchten, ist die while-Anweisung genau das, was Sie wollen:

while (condition) Inline Statement

Die bedingte Anweisung – die ebenfalls ein boolescher Ausdruck ist – steuert die Häufigkeit, mit der die enthaltene Anweisung ausgeführt wird. Mit break- und continue-Anweisungen können Sie die Ausführung von Anweisungen in einer while-Anweisung steuern, die genauso funktioniert wie in einer for-Anweisung.

4,do

Die letzte in C# verfügbare Schleifenanweisung ist die do-Anweisung. Sie ist einer while-Anweisung insofern sehr ähnlich, als die Bedingung erst nach der ersten Schleife überprüft wird.

do
{
内含语句
}
while (条件);
Die do-Anweisung garantiert, dass die enthaltenen Anweisungen mindestens einmal ausgeführt wurden, und sie werden weiterhin ausgeführt, solange die Bedingung als wahr ausgewertet wird. Mithilfe der break-Anweisung können Sie die Ausführung zum Verlassen des do-Blocks erzwingen. Wenn Sie diese Schleife überspringen möchten, verwenden Sie die continue-Anweisung.

Leistungsvergleich

Foreach arbeitet mit einer Kopie des Arrays (durch Kopieren des Arrays), während while durch Verschieben des internen Index des Arrays arbeitet. Im Allgemeinen wird davon ausgegangen, dass while dies tun sollte schneller sein als foreach (da foreach zuerst das Array kopiert, wenn es mit der Ausführung beginnt, während while direkt den internen Zeiger bewegt), aber das Ergebnis ist genau das Gegenteil.

Was in der Schleife ausgeführt wird, ist eine Array-"Lese"-Operation, daher ist foreach schneller als while:

foreach ($array as $value) { 
echo $value; 
} 
while (list($key) = each($array)) { 
echo $array[$key]; 
}
Was in der Schleife ausgeführt wird, ist eine Array-"Schreib"-Operation, also ist while schneller als foreach:

foreach ($array as $key => $value) { 
echo $array[$key] = $value . '...'; 
} 
while (list($key) = each($array)) { 
$array[$key] = $array[$key] . '...'; 
}
Lassen Sie uns zunächst die Zeit testen, die zum Durchlaufen eines

eindimensionalen Arrays mit 50.000 Indizes benötigt wird:

<?php
/*
  * @ Author: Lilov
  * @ Homepage: www.111cn.net
  * @ E-mail: zhongjiechao@gmail.com
  *
  */
$arr = array();
for($i = 0; $i < 50000; $i++){
$arr[] = $i*rand(1000,9999);
}
function GetRunTime()
{
list($usec,$sec)=exp lode(" ",microtime());
return ((float)$usec+(float)$sec);
}
######################################
$time_start = GetRunTime();
for($i = 0; $i < count($arr); $i++){
$str .= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#39;Used time of for:&#39;.round($time_used, 7).&#39;(s)<br><br>&#39;;
unset($str, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();
while(list($key, $val) = each($arr)){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#39;Used time of while:&#39;.round($time_used, 7).&#39;(s)<br><br>&#39;;
unset($str, $key, $val, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();
foreach($arr as $key => $val){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#39;Used time of foreach:&#39;.round($time_used, 7).&#39;(s)<br><br>&#39;;
######################################
?>
Testergebnisse:

Mittelwert der drei Testergebnisse:

entspricht for, while bzw. foreach
0,1311650
0,1666853
0,1237440

Nach wiederholten Tests zeigen die Ergebnisse das Für Beim Durchlaufen desselben Arrays ist foreach am schnellsten und while am langsamsten. foreach ist etwa 20 bis 30 % schneller als while. Fügen Sie dann den Array-Index zu 500000 und 5000000 hinzu und das Testergebnis ist dasselbe. Aber aus prinzipieller Sicht arbeitet foreach an einer Kopie des Arrays (durch Kopieren des Arrays), während while durch Verschieben des internen Index des Arrays arbeitet. Im Allgemeinen wird angenommen, dass while schneller sein sollte als foreach (weil foreach führt zuerst das Array aus, während while den internen Zeiger direkt bewegt, aber das Ergebnis ist genau das Gegenteil. Der Grund dürfte darin liegen, dass es sich bei foreach um eine interne Implementierung von PHP handelt, während es sich bei while um eine allgemeine Schleifenstruktur handelt.

Das obige ist der detaillierte Inhalt vonUnterschiede und Leistungsvergleich zwischen foreach- und while-Schleifen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn