Wie man Schleifen in PHP schneller durchlaufen kann.
Dies ist der erste Eintrag aus der Reihe der 100 besten PHP Tips und Tricks. Ich habe mich zu dem Post mit der Schleife dazu entschieden, weil ich immer wieder in verschiedenen Scripten darüber stosse, wie man es nicht machen sollte.
Wie man in PHP Schleifen nicht machen sollte
Download Code!
for($i = 0; $i < count($liste); $i++) { // tue irgendwas
}
Schnellere Schleifen - so ist es richtig:
Download Code!
for($i = 0, $size = count($liste); $i < $size; ++$i) { // tue irgendwas
}
Worin liegt der Vorteil bei der zweiten Version der Schleife?
Zum einen verwenden wir eine Variable für die Größe der Liste/Arrays. Das ist die Variable $size. Die Größe des Arrays wird so in PHP nur ein einziges Mal abgefragt.
Zum anderen ist die Erhöhung des Zählers umgestellt worden. Er macht einen sogenannten Preincrement anstatt einen Postincrement. Der Preincrement mit ++$i ist wesentlich schneller als der Postincrement mit $i++.
Proof of the concept
Download Code!
$loops = 100000;
for ($i = 0; $i < $loops; $i++) {
}
echo ($stop - $start)."\n";
for ($i = 0; $i < $loops; ++$i) {
}
echo ($stop - $start)."\n";
// Jetzt mit einem Array
for ($i = 0; $i < count($someArray); $i++) {
}
echo ($stop - $start)."\n";
for ($i = 0, $size = count($someArray); $i < $size; ++$i) {
}
echo ($stop - $start)."\n";
0.89327216148376
0.90055012702942
5.1975250244141E-005
4.3869018554688E-005
Wenn ihr so die Schleifen in PHP baut sind sie um ein viellfaches schneller als in der ersten Variante.
Das ist der erste PHP-Tip aus der Serie der 100 PHP Tricks
Beweis - Preencrement funktioniert richtig.
Aufgrund der Aussage von Schlingel, welche nicht richtig ist, hier der Beweis für das korrekte Verhalten.
Download Code!
// Es soll eine Ausgabe von 0-2 produziert werden und bewiesen werden, dass die Zählung bei 0 beginnt.
for($i = 0; $i < 3; ++$i) {
echo 'Counter ist auf: '.$i."\n";
}
Wie erwartet produziert die Scheife folgende Ausgabe:
Counter ist auf: 0
Counter ist auf: 1
Warning: assert() [function.assert]: Assertion failed in testPreencrement.php on line 5
Counter ist auf: 2
Warning: assert() [function.assert]: Assertion failed in testPreencrement.php on line 5
Gerade im Entwickler-Blog einen kleinen Tipp zur Optimierung von for-Schleifen gelesen. Die Idee ist nicht neu aber gut, jedoch wieviel bringt sie? Ein Benchmark wird es zeigen. Zuerst wird ein Array mit 1.000 Schlüsseln erzeugt und dann nochmal durch...
Aufgenommen: Sep 24, 21:52