In diversen Blog’s ist zu lesen, das $i++ bedeutend schneller ist als ++$i. In genug anderen ist zu lesen dass es genau andersherum ist. Grund genug, dieses selbst einmal auszutesten.
Dazu wurde folgendes Skript benutzt:
$start1 = microtime(true);
while ($i++<$rounds);
$end1 = microtime(true);$i=0;
$start2 = microtime(true);
while (++$i<$rounds);
$end2 = microtime(true);
Wobei die Anzahl der Erhöhungen sowohl mit 10.000.000 als auch mit 100.000.000 Durchläufen getestet wurde. Um ein vernünftiges Ergebnis zu erzielen haben wir den Test auch gleich auf drei Servern durchgeführt.
Und hier ist da Ergebnis:
| Server 1 10.000.000 Durchläufe | Server 1 100.000.000 Durchläufe | Server 2 10.000.000 Durchläufe | Server 3 10.000.000 Durchläufe | Server 3 100.000.000 Durchläufe | |
| $i++ | 2,205 s | 20,081 s | 2,461 s | 1,708 s | 9,444 s |
| ++$i | 2,549 s | 27,444 s | 1,250 s | 0,904 s | 9,002 s |
(Mittelwerte aus jeweils 3 Testläufen) Getestet wurde auf jedem Server mit der gleichen PHP Version.
Wie man erkennt, ist $i++ schneller. ++$i aber auch. Man kann also keine allgemeine Aussage darüber treffen, welches die schnellere Variante ist.
Dies könnte daran liegen, dass die Compiler den Source Code unterschiedlich optimieren.
In einigen anderen Blogs wird noch darauf hingewiesen das $i−− bzw −−$i schneller bearbeitet wird. Dies haben wir mit folgendem Script ebenfalls gleich getestet:
$i=$rounds;
$start3 = microtime(true);
while ($i−−>0);
$end3 = microtime(true);$i=$rounds;
$start4 = microtime(true);
while (−−$i>0);
$end4 = microtime(true);
Ergebnis:
| Server 1 10.000.000 Durchläufe | Server 1 100.000.000 Durchläufe | Server 2 10.000.000 Durchläufe | Server 3 10.000.000 Durchläufe | Server 3 100.000.000 Durchläufe | |
| $i−− | 2,325 s | 23,052 s | 1,047 s | 0,830 s | 8,382 s |
| −−$i | 2,159 s | 24,776 s | 1,179 s | 0,900 s | 8,987 s |
(Mittelwerte aus jeweils 3 Testläufen) Getestet wurde auf jedem Server mit der gleichen PHP Version.
Tatsächlich ist die Dekrement Variante schneller als die Inkrement Variante.
Hier noch einmal das ganze Skript:
<?php
$rounds = 100000000;
$i=0;$start1 = microtime(true);
while ($i++<$rounds);
$end1 = microtime(true);$i=0;
$start2 = microtime(true);
while (++$i<$rounds);
$end2 = microtime(true);$i=$rounds;
$start3 = microtime(true);
while ($i−−>0);
$end3 = microtime(true);$i=$rounds;
$start4 = microtime(true);
while (−−$i>0);
$end4 = microtime(true);echo “\$i++: “.round($end1 – $start1, 3).”Sekunden\n”;
echo “++\$i: “.round($end2 – $start2, 3).”Sekunden\n”;
echo “\$i−− : “.round($end3 – $start3, 3).”Sekunden\n”;
echo “−−\$i: “.round($end4 – $start4, 3).”Sekunden\n”;?>