PHP: Benchmark Inkrement und Dekrement
Wir haben alle in der Schule das kleine EinMalEins gelernt, doch selbst bei den simpelsten Anweisungen in Programmiersprachen gibt es noch Wissenlücken über Verwendung und Laufzeitunterschiede.
Im nachfolgenden Post wird mittels Benchmark ermittelt welche Art die schnellste ist eine Variable in PHP5 um 1 zu erhöhen (inkerment) oder zu verringern (decrement).
Fangen wir erstmal damit an aufzulisten was es alles für Möglichkeiten dafür gibt. Ich beziehe mich dazu auf die Möglichkeiten des inkrementieren, das dekrementieren funktioniert analog dazu.
Möglichkeiten:
Einfache Neuzuweisung des inkrementierten Werts:
Der Wert von $i wird genommen, um eins erhöht und dieser Wert dann wieder in die Variable $i geschrieben.
Die 1 wird genommen und der Wert von $i dazuaddiert. Dieser Wert wird dann in$ i gespeichert. Achtung beim dekrement, hier entsteht ein Vorzeichenwechsel.
Ein Kurzschreibweise für $i = $i + 1;
Der Variable $i wird eins hinzuaddiert. ++$i wird auch Pre-Inkrement genannt, da es (pre = vor) vor der Verwendung angewendet wird. Erklärung was "pre" genau bedeutet:
$i = 1; echo $array[++$i]; => Es wird auf den Wert von $array[2] zugegriffen. $i hat danach den Wert 2.
Der Variable $i wird eins hinzuaddiert. $i++ wird auch Post-Inkrement genannt, da es (post = nach) nach der Verwendung angewendet wird. Erklärung was "post" genau bedeutet:
$i = 1; echo $array[$i++]; => Es wird auf den Wert von $array[1] zugegriffen. $i hat danach den Wert 2.
Benchmark:
Welche der Möglichkeiten ist die schnellste?
Für den Benchmark habe ich diesen Code verwendet:
--- wird nachgereicht ---
Als Ergebnis habe ich auf meinem Eee mit Atom N280 und Ubuntu 9.04 bekommen:
Iterator Benchmark with 1000000 iterations
------------------------------------
--- Inkrement ---
0.3493 Seconds for ++$i ;
0.3806 Seconds for $i += 1 ;
0.3887 Seconds for $i++ ;
0.4603 Seconds for $i = 1 + $i ;
0.4699 Seconds for $i = $i + 1 ;
--- Dekrement ---
0.3370 Seconds for --$i ;
0.3767 Seconds for $i -= 1 ;
0.4348 Seconds for $i-- ;
0.4741 Seconds for $i = $i - 1 ;
Ergebnis:
Man kann deutlich erkennen dass die normalen Wertezuweisungen mit $i + 1 langsamer sind als die Post/Pre oder Kurzsyntax-Varianten.
Bei den beiden langsameren Varianten muss der Computer zusätzliche Lade und Speicheroperationen machen welche bei den schnelleren drei Varianten entfallen können. Dazu gibt es meist eine in- und decrement Funktionen in Machinensprache welche dies nochmal wesentlich beschleunigen kann.
Wenn man mit der Post, Pre oder Kurzvariante Variante arbeiten kann sollte man diese immer bevorzugen. Es gibt auch Optimizer für PHP die teils an solchen Stellen ansetzten um noch etwas mehr Geschwindigkeit zu erreichen.
Mit diesen Ergebnissen im Hinterkopf könnte die nächste Schleife ein bisschen schneller werden.
No related posts.