PHP Benchmark: for
Die gute alte “for i” Schleife, fast überall zu finden nur wie performant ist sie wirklich. Ich habe diese Tests lokal mit nginx und PHP5 als FastCGI ausgeführt. Mal schaun was dabei rauskommt. Die folgenden Test wurden 1000 mal durchgeführt.
Variante 1.1 – mit vorgegebener Anzahl an Durchläufen und Post-Inkrement
for($i = 1; $i < 10000; $i++);
Variante 1.2 – mit vorgegebener Anzahl an Durchläufen und Pre-Inkrement
for($i = 1; $i < 10000; ++$i);
Ergebnis 1.1 MIN: (0.000434) - AVG: (0.000448) - MAX: (0.001341) Ergebnis 1.2 MIN: (0.000403) - AVG: (0.000414) - MAX: (0.001255)
Das erstaunliche bei diesem Benchmark ist, dass der minimalste erreichte Wert grundsätzlich der gleiche war. Trotzdem war der Test mit Pre-Inkrement etwas schneller.
Variante 2.1 – mit berechneter Anzahl an Durchläufen und Post-Inkrement (count($a) = 10000)
for($i = 1; $i < count($a); $i++);
Variante 2.2 – mit berechneter Anzahl an Durchläufen und Pre-Inkrement (count($a) = 10000)
for($i = 1; $i < count($a); ++$i);
Ergebnis 2.1 MIN: (0.001811) - AVG: (0.001838) - MAX: (0.005526) Ergebnis 2.2 MIN: (0.001785) - AVG: (0.001819) - MAX: (0.005409)
Das oben festgestellte Phänomen traf bei dieser Variante nicht auf, hier war der minimalste Wert immer ein anderer. Allerdings war hier die Pre-Inkrement Variante wieder die schneller Methode.
Variante 3.1 – mit zuvor berechneter Anzahl an Durchläufen und Post-Inkrement ($b = 10000)
$b = count($a); for($i = 1; $i < $b; $i++);
Variante 3.2 – mit zuvor berechneter Anzahl an Durchläufen und Pre-Inkrement ($b = 10000)
$b = count($a); for($i = 1; $i < $b; ++$i);
Ergebnis 3.1 MIN: (0.000445) - AVG: (0.000452) - MAX: (0.001368) Ergebnis 3.2 MIN: (0.000423) - AVG: (0.000440) - MAX: (0.001321)
Man sieht hier sehr deutlich das nicht immer die kürzere Schreibweise (Variante 2) auch die schnellere ist. Auch hier ist der Pre-Inkrement der schnellere Weg.
Fazit
Wenn man die Anzahl der Durchläufe kennt sollte man auf die erste Variante zurückgreifen. Ist die Anzahl variabel dann weicht man auf die 3. Variante aus. Grundsätzlich sollte die Verwendung des Pre-Inkrements (++$i) bevorzugt werden.

Juni 9th, 2010 at 01:14
Ja, so sieht das aus. Ganz wie erwartet. Etwas beschleunigen kann man es noch indem man den dritten operator wegfallen lässt, z.B. durch herunterzählen: for($i=$max; $i–; ){}
Das ist dann fürs Auge schon recht 1337 ^-^
In den Tests einiger Leute liest man mitunter auch dass while() immer die Nase vorn hat, komme was wolle – das konnten wir hier aber nicht verifizieren. Und wenn schon ….
- leserlich muss es bleiben
- die Bottlenecks sind doch eher die Datenschnittstellen
Aber es wurde mal wieder Zeit einen solchen Test zu finden, man bleibt ja doch seinen Wurzeln treu. Mein letzter in die Richtung (zumindest von den Wenigen, die ich gepostet habe): http://openminds.lucido-media.de/php-performance-asort
Juni 12th, 2010 at 07:45
[...] oder nicht. Jetzt wissen wir das die erste Variante die schnellere ist, allerdings ist die for Schleife etwas fixer. Um die beiden Schleifen mit einander vergleichen zu können müssen wir einen Zugriff [...]
März 5th, 2011 at 02:13
Hallo,
mein Kompliment, sehr ansprechende Seite und sehr Informativ.
Gruß aus dem Saarland
Thomas Keller
http://www.saarpfalz24.de
Januar 22nd, 2012 at 13:08
Da sieht man erst mal was man alles falshc machen kann,danke für die Tipps. Ich bin noch recht neu in der PHP Programmierung und da ich auf Cronjobs angewiesen bin zaählt jede Sekunde.
Februar 27th, 2012 at 15:37
Super Beitrag, vielen Dank, das war mir so gar nicht bewusst