Performanz von Schleifen
Im Laufe meines Schaffens bin ich immer wieder mit Fragen der Performanz von Anwendungen konfrontiert worden. Ich möchte an dieser Stelle ein paar wenige Erkenntnisse zu Schleifen weitergeben.
Schleifen
// Fall 1 for ($i=0; $iWelche ist am schnellsten?
Foreach ist signifikant schneller als alle anderen Schleifengebilde. Bei 100.000 Durchläufen ist sie fast doppelt so schnell wie die langsamste For-Variante.
Sie ist immer ein Drittel schneller als die WHILE-Schleife, welche sich auf Augenhöhe mit den schnellen FOR-Varianten befindet.
Wenn man auf die FOR-Schleife angewiesen ist, dann sollte man einen Aspekt beachten, der oft misachtet wird. Selbst in populären PHP-Frameworks wie ZEND tauchen diese Leistungsbremsen auf:Die COUNT-Funktion darf niemals Teil des Test-Ausdrucks sein, weil sie dann jedesmal ausgeführt wird. Dies führt zur Leistungseinbuße. Die COUNT-FUNKTION sollte entweder als Initialisierungsausdruck oder übergebene Variable verwendet werden.
Also caseForF1 oder caseForF3, niemals caseForF2, verwenden!!!Zur Erinnerung: for (Initialisierung; Test; Fortsetzung) Anweisung
Array
(
[caseFor1] =>
(
[0] => 0.04059
[1] => 0.03651
)
[caseFor2] =>
(
[0] => 0.4936
[1] => 0.49378
)
[caseFor3] =>
(
[0] => 0.04068
[1] => 0.03656
)[caseForeach] =>
(
[0] => 0.02635
[1] => 0.0261
)[caseWhile] =>
(
[0] => 0.03653
[1] => 0.03617
))
Test Code:
/** * case F1 => for without count * case F2 => for with count * case F3 => for rearranged * case E => foreach * case W => while */ $runs = range(0,1); $results = array(); foreach($runs as $run) { $range = range(1,100000); // F1 $start = microtime(); $count = count($range); for($i=0;$i<$count;$i++){} $end = microtime(); $results["caseF1"][] = ((int)(($end - $start)*100000)/100000); // F2 $start = microtime(); for($i=0;$i