02
Jun

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.

5 Kommentare zu “PHP Benchmark: for”

  1. PHP Agentur Sagt:

    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

  2. PHP Benchmark: foreach | casibus Sagt:

    [...] 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 [...]

  3. Thomas Keller Sagt:

    Hallo,
    mein Kompliment, sehr ansprechende Seite und sehr Informativ.

    Gruß aus dem Saarland
    Thomas Keller

    http://www.saarpfalz24.de

  4. Thomas Sagt:

    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.

  5. Andreas Müller Sagt:

    Super Beitrag, vielen Dank, das war mir so gar nicht bewusst

hinterlasse eine Nachricht