Benchmark: $i++ vs ++$i
25. Dezember 2007
Der erste im Titel genannte Befehl wird in PHP-Skripten sehr gerne eingesetzt: Er erhöht die Zählvariable $i um 1. Die zweite Anweisung macht genau das gleiche, also wieso miteinander vergleichen?
Im Web kursieren Geschichten, dass letzteres schneller sei als erstere. Zeit für einen Vergleich! Damit der Test auch aussagekräftig genug ist, wird der Befehl gleich 10.000.000 ausgeführt. Das bringt auch neuere PCs kurz zum Schwitzen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // IncrementBench.php $rounds = 10000000; $start1 = microtime(true); for ($i = 0; $i < $rounds; $i++); $end1 = microtime(true); $start2 = microtime(true); for ($i = 0; $i < $rounds; ++$i); $end2 = microtime(true); echo "\$i++: ".round($end1 - $start1, 5)."Sekunden\n"; echo "++\$i: ".round($end2 - $start2, 5)."Sekunden\n"; |
Ausgabe des Benchmarks:
michael@michfrm-home:~/Desktop$ php IncrementBench.php
$i++: 3.30877 Sekunden
++$i: 2.81894 Sekunden
Es gibt wirklich einen Unterschied, oft brauchen tut man ihn aber nicht:
1 2 3 4 5 6 7 | // iTest.php $i = 0; echo $i++ . "\n"; $i = 0; echo ++$i . "\n"; |
Ausgabe:
0
1
Bei $i++ wird zuerst der aktuelle Wert zutück gegeben und dann die Variable hoch gezählt. Bei ++$i zuerst hochgezählt und dann zurück gegeben.
Hier noch einen Tipp:
<BadBoy_> un –$i is schneller als ++$i
<BadBoy_> also wenn reihenfolge egal dann runterzählen, net hoch![]()
Nachgetestet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // IncrementBench.php (-- Version) $rounds = 10000000; $start1 = microtime(true); for ($i = $rounds; $i > 0; $i--); $end1 = microtime(true); $start2 = microtime(true); for ($i = $rounds; $i > 0; --$i); $end2 = microtime(true); echo "\$i--: ".round($end1 - $start1, 5)."Sekunden\n"; echo "--\$i: ".round($end2 - $start2, 5)."Sekunden\n"; |
Ausgabe:
michael@michfrm-home:~/Desktop$ php IncrementBench.php
$i–: 3.07346 Sekunden
–$i: 2.62946 Sekunden
na wat sag ich