Kategorien
Dez.
14
PHP Benchmark Teil 1: for()-Schleifen
Autor: Sascha Kalabuchow
Bevor man sich an ein neues Projekt heran traut, sollte man als erstes sich überlegen, welche Funktionen setze ich wie ein. Daher fangen wir jetzt mal an, die Funktionen und die Funktionsvarianten genau unter die Lupe zu nehmen. Im ersten Teil unseres Benchmarks widmen wir uns der guten alten for()-Schleife.
Testumgebung
PHP 5.2.0
PHP ist als Modul installiert
Intel Quad 2,66 GHz, 4 GB DDR3 RAM
Im nachfolgenden Test, werden wir nicht auf for()-Schleifen mit vorgegebener Anzahl eingehen, da diese doch eher sehr selten eingesetzt werden.
Variante 1 – direktes berechnen über count() - Post-Inkrement
for($i=0;$i<count($array);$i++){}
Variante 2 – direktes berechnen über sizeof() - Post-Inkrement
for($i=0;$i<sizeof($array);$i++){}
Testumgebung
PHP 5.2.0
PHP ist als Modul installiert
Intel Quad 2,66 GHz, 4 GB DDR3 RAM
Im nachfolgenden Test, werden wir nicht auf for()-Schleifen mit vorgegebener Anzahl eingehen, da diese doch eher sehr selten eingesetzt werden.
Variante 1 – direktes berechnen über count() - Post-Inkrement
for($i=0;$i<count($array);$i++){}
Variante 2 – direktes berechnen über sizeof() - Post-Inkrement
for($i=0;$i<sizeof($array);$i++){}
Variante 3 – direktes berechnen über count() - Pre-Inkrement
for($i=0;$i<count($array);++$i){}
Variante 4 – direktes berechnen über sizeof() - Pre-Inkrement
for($i=0;$i<sizeof($array);++$i){}
Variante 5 – vorheriges berechnen über count() - Post-Inkrement
$size=count($array);
for($i=0;$i<$size;$i++){}
Variante 6 – vorheriges berechnen über sizeof() - Post-Inkrement
$size=sizeof($array);
for($i=0;$i<$size;$i++){}
for($i=0;$i<count($array);++$i){}
Variante 4 – direktes berechnen über sizeof() - Pre-Inkrement
for($i=0;$i<sizeof($array);++$i){}
Variante 5 – vorheriges berechnen über count() - Post-Inkrement
$size=count($array);
for($i=0;$i<$size;$i++){}
Variante 6 – vorheriges berechnen über sizeof() - Post-Inkrement
$size=sizeof($array);
for($i=0;$i<$size;$i++){}
Variante 7 – vorheriges berechnen über count() - Pre-Inkrement
$size=count($array);
for($i=0;$i<$size;++$i){}
Variante 8 – vorheriges berechnen über sizeof() - Pre-Inkrement
$size=sizeof($array);
for($i=0;$i<$size;++$i){}
$size=count($array);
for($i=0;$i<$size;++$i){}
Variante 8 – vorheriges berechnen über sizeof() - Pre-Inkrement
$size=sizeof($array);
for($i=0;$i<$size;++$i){}
|
Varianten
|
1.000 Schleifen
|
10.0000 Schleifen
|
100.000 Schleifen
|
|
1
|
0,0004148 Sek.
|
0,0044491 Sek.
|
0,0408308 Sek.
|
|
2
|
0,0004366 Sek.
|
0,0044026 Sek.
|
0,0420843 Sek.
|
|
3
|
0,0003972 Sek.
|
0,0039839 Sek.
|
0,0405127 Sek.
|
|
4
|
0,0004512 Sek.
|
0,0039539 Sek.
|
0,0401367 Sek.
|
|
5
|
-
|
0,0008165 Sek.
|
0,0081104 Sek.
|
|
6
|
-
|
0,0008191 Sek.
|
0,0083894 Sek.
|
|
7
|
-
|
0,0007309 Sek.
|
0,0071815 Sek.
|
|
8
|
-
|
0,0006945 Sek.
|
0,0070491 Sek.
|
Wie wir durch diese Kalkulationen ersehen können, sollte man for()-Schleifen per direktes berechnen sofort vergessen. Da diese erheblich länger brauchen als for()-Schleifen mit vorherigem berechnen.
Aber wieso ist das so?
Die Antwort ist recht einfach. Bei der direkten Berechnung in der for()-Schleife, berechnet die for()-Schleife in dem Durchgang durch count() oder sizeof() die Anzahl der Elemente in einem Array. Was natürlich nicht gerade Performance orientiert ist.
Auch geht aus unserem Test hervor, dass die Schleife Variante 8 am schnellsten den Datensatz abarbeiten kann.
Wenn ihr diesen Test nachbauen wollt, gibt es hier jetzt mal ein Beispiel von Variante 8 mit 100.000 Durchläufen.
<?php
//Erzeuge ein Array zum testen
$array=array();
for($i=0;$i<=100000;++$i){
$array[]=$i;
}
//Start der Berechnung
$start=microtime(true);
//for()-Schleife durchlaufen
$size=sizeof($array);
for($i=0;$i<$size;++$i){}
//Ende der Berechnung
$end=microtime(true);
//Ausgabe der Durchlaufzeit in Sekunden
print $end-$start;
?>
Autor: Sascha Kalabuchow
Kommentare
Noch keine Kommentare vorhanden