Zunächst einmal verstehe ich, dass in 90% der Anwendungen der Leistungsunterschied völlig irrelevant ist, aber ich muss nur wissen, welches das schnellere Konstrukt ist. Das und ...
Die Informationen, die derzeit im Internet verfügbar sind, sind verwirrend. Viele Leute sagen, dass foreach schlecht ist, aber technisch sollte es schneller sein, da es das Schreiben eines Array-Traversals mit Iteratoren vereinfachen soll. Iteratoren, von denen wiederum angenommen wird, dass sie schneller sind, aber in PHP anscheinend auch absolut langsam sind (oder ist dies keine PHP-Sache?). Ich spreche von den Array-Funktionen: next () prev () reset () usw. Nun, wenn es sich um gerade Funktionen handelt und nicht um eine dieser PHP-Sprachfunktionen, die wie Funktionen aussehen.
Um dies ein wenig einzugrenzen : Ich bin nicht daran interessiert, Arrays in Schritten von mehr als 1 zu durchlaufen (auch keine negativen Schritte, dh umgekehrte Iteration). Ich bin auch nicht an einer Durchquerung von und zu beliebigen Punkten interessiert, nur 0 bis zur Länge. Ich sehe auch nicht, dass Arrays mit mehr als 1000 Schlüsseln regelmäßig manipuliert werden, aber ich sehe, dass ein Array in der Logik einer Anwendung mehrmals durchlaufen wird! Auch für Operationen, größtenteils nur String-Manipulation und Echo.
Hier einige Referenzseiten:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Was ich überall höre:
foreach
ist langsam und somitfor
/while
ist schneller- PHPs kopieren
foreach
das Array, über das es iteriert. Um es schneller zu machen, müssen Sie Referenzen verwenden - Code wie folgt : ist schneller als ein
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
Hier ist mein Problem. Ich habe dieses Testskript geschrieben: http://pastebin.com/1ZgK07US und egal wie oft ich das Skript ausführe, ich erhalte Folgendes:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
Zusamenfassend:
foreach
ist schneller alsforeach
mit Referenzforeach
ist schneller alsfor
foreach
ist schneller alsfor
für eine Hash-Tabelle
Kann jemand erklären?
- Mache ich etwas falsch?
- Macht PHP für jede Referenz wirklich einen Unterschied? Ich meine, warum sollte es nicht kopiert werden, wenn Sie als Referenz übergeben werden?
- Was ist der äquivalente Iteratorcode für die foreach-Anweisung? Ich habe einige im Netz gesehen, aber jedes Mal, wenn ich sie teste, ist das Timing weit entfernt. Ich habe auch ein paar einfache Iteratorkonstrukte getestet, aber nie anständige Ergebnisse zu erzielen - sind die Array-Iteratoren in PHP einfach schrecklich?
- Gibt es schnellere Möglichkeiten / Methoden / Konstrukte, um durch ein anderes Array als FOR / FOREACH (und WHILE) zu iterieren?
PHP Version 5.3.0
Bearbeiten: Antwort Mit Hilfe der Leute hier konnte ich die Antworten auf alle Fragen zusammensetzen. Ich werde sie hier zusammenfassen:
- "Mache ich etwas falsch?" Der Konsens scheint zu sein: Ja, ich kann Echo nicht in Benchmarks verwenden. Persönlich sehe ich immer noch nicht, wie Echo eine Funktion mit zufälliger Ausführungszeit ist oder wie eine andere Funktion irgendwie anders ist - das und die Fähigkeit dieses Skripts, genau die gleichen Ergebnisse von foreach besser als alles zu generieren, ist schwierig zu erklären, obwohl nur "Sie verwenden Echo" (nun, was hätte ich verwenden sollen). Ich gebe jedoch zu, dass der Test mit etwas Besserem durchgeführt werden sollte; Ein idealer Kompromiss fällt mir jedoch nicht ein.
- "Macht PHP für jede Referenzsache wirklich einen Unterschied? Ich meine, warum sollte es nicht kopiert werden, wenn Sie als Referenz übergeben werden?" ircmaxell zeigt, dass dies der Fall ist. Weitere Tests scheinen zu beweisen, dass die Referenz in den meisten Fällen schneller sein sollte - obwohl angesichts meines obigen Codeausschnitts definitiv nicht alles bedeutet. Ich akzeptiere, dass das Problem wahrscheinlich zu nicht intuitiv ist, um es auf einer solchen Ebene zu behandeln, und dass etwas Extremes wie das Dekompilieren erforderlich wäre, um tatsächlich zu bestimmen, welches für jede Situation besser ist.
- "Was ist der äquivalente Iterator-Code für die foreach-Anweisung? Ich habe einige im Internet gesehen, aber jedes Mal, wenn ich sie teste, ist das Timing weit entfernt. Ich habe auch einige einfache Iterator-Konstrukte getestet, aber nie anständige Ergebnisse zu erzielen - Sind die Array-Iteratoren in PHP einfach schrecklich? " ircmaxell lieferte die Antwort unten; Der Code ist jedoch möglicherweise nur für die PHP-Version> = 5 gültig
- "Gibt es schnellere Möglichkeiten / Methoden / Konstrukte, um durch ein anderes Array als FOR / FOREACH (und WHILE) zu iterieren?" Danke an Gordon für die Antwort. Die Verwendung neuer Datentypen in PHP5 sollte entweder eine Leistungssteigerung oder eine Speichersteigerung bewirken (je nach Ihrer Situation kann dies wünschenswert sein). Während die Geschwindigkeit vieler neuer Array-Typen nicht besser zu sein scheint als array (), scheinen die Splpriorityqueue und der Splobject-Speicher wesentlich schneller zu sein. Link bereitgestellt von Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Vielen Dank an alle, die versucht haben zu helfen.
Ich werde mich wahrscheinlich für jede einfache Durchquerung an foreach (die Nicht-Referenzversion) halten.