1. Gutschein, Gueltigkeit bis 31.05.2008: 5 Euro Gutschein fuer das Indiana Jones Steelbook bei Amazon. Gehe hierher: Link, waehle das Steelbook aus und gebe als Gutscheincode am Ende des Bestellvorgangs ein:
INDIANAJ
2. Gutschein, Gueltigkeit bis 30.06.2008: 5 Euro Gutschein fuer die Amango.de DVD Flatrate, wer zuerst kommt hat ihn, alle anderen haben evtl. Pech gehabt: nach der Anmeldung auf amango.de als Gutscheincode eingeben:
638524
Schreibt doch bitte per Kommentar, obs geklappt hat.
Sonntag, 25. Mai 2008
Gutscheine zu verschenken
PHP Effizienz: Konstanten vs Variablen und Binaerer Entscheidungsbaum mit IF ELSE
Eine Messung ergab dass
tatsaechlich ca. 4 mal schneller ist, als wenn es 16 IFs sind von ==1 bis ==16. Ersetzt man die Konstante PRES_OKT zudem durch eine Variable wird es doppelt so schnell. Das Gebot der Stunde: nutze Konstanten nur zum Definieren durch die User, nutze aber im Code lieber "normale" Variablen.
Als naechstes wird ein binaerer Entscheidungsbaum bzgl. if else untersucht. Da handerarbeitet habe ich ihn nur fuer 16 Elemente gebaut: Laesst man in den Blattknoten 2 bis 3 Elemente zu die (wichtig!) mit if elseif elseif durchgegangen werden, ist ein solcher Baum (wohlgemerkt fuer nur 16 Elemente, dieser hier ist relativ klein) ca. 2mal so schnell wie der o.g. Code mit 16 if elseif.. der Optimierungsfaktor duerfte sich natuerlich mit mehr Elementen deutlich erhoehen.
CODE:
if (PRES_OKT == 1) $s = '';
elseif (PRES_OKT == 2) $s = '';
elseif (PRES_OKT == 3) $s = '';
elseif (PRES_OKT == 4) $s = '';
tatsaechlich ca. 4 mal schneller ist, als wenn es 16 IFs sind von ==1 bis ==16. Ersetzt man die Konstante PRES_OKT zudem durch eine Variable wird es doppelt so schnell. Das Gebot der Stunde: nutze Konstanten nur zum Definieren durch die User, nutze aber im Code lieber "normale" Variablen.
Als naechstes wird ein binaerer Entscheidungsbaum bzgl. if else untersucht. Da handerarbeitet habe ich ihn nur fuer 16 Elemente gebaut: Laesst man in den Blattknoten 2 bis 3 Elemente zu die (wichtig!) mit if elseif elseif durchgegangen werden, ist ein solcher Baum (wohlgemerkt fuer nur 16 Elemente, dieser hier ist relativ klein) ca. 2mal so schnell wie der o.g. Code mit 16 if elseif.. der Optimierungsfaktor duerfte sich natuerlich mit mehr Elementen deutlich erhoehen.
PHP Effizienz: if elseif vs switch case vs. ternaer
Traue keiner Statistik die Du nicht selbst gefaelscht hast. Auf einigen Seiten steht der ternaere Operator sei der schnellste vs. if (elseif, else, ...) und switch case.
Wendet man jedoch Geschwindigkeitsmessungen beim PRES mit diesen Strukturen an, sieht es wieder ganz anders aus:
bekanntlich ist das original format wie folgt:
Wenn jetzt die Frage aufkommt, warum Strings? -> Das liegt daran dass PHP 4 bis PHP 5.1.2 ca. stolze 10mal langsamer ist, wenn man stattdessen Arrays (selbst bei Zahlenvergleich!) verwendet.
Die if/elseif Struktur benoetigt bei 100.000 Runs
if: 0.240842819214
Baut man die Verzweigungsstruktur auf den ternaeren Operator um, kann das so aussehen:
Doch dies ist von der Laufzeit schlechter, bei 100.000 Runs
ternaer: 0.380263090134
Was noch bleibt ist switch case. Das kann so aussehen:
das spart zwar im Schnitt ca. 6 * 137 Zeichen Quelltext, ist aber nach Messungen geringfuegig langsamer: 100.000 runs
case: 0.273416042328
Was bleibt: ich haette mal wieder Lust auf PHP-bashing
Wendet man jedoch Geschwindigkeitsmessungen beim PRES mit diesen Strukturen an, sieht es wieder ganz anders aus:
bekanntlich ist das original format wie folgt:
CODE:
if ...
elseif ( PRES_OKT == 8 ) $forbiddenIPs=' 8.4.9.191 8.6.95.148 ... ';
...
Wenn jetzt die Frage aufkommt, warum Strings? -> Das liegt daran dass PHP 4 bis PHP 5.1.2 ca. stolze 10mal langsamer ist, wenn man stattdessen Arrays (selbst bei Zahlenvergleich!) verwendet.
Die if/elseif Struktur benoetigt bei 100.000 Runs
if: 0.240842819214
Baut man die Verzweigungsstruktur auf den ternaeren Operator um, kann das so aussehen:
CODE:
(PRES_OKT == 4 ? $ips = ' 4.x.y.z ... ' :
...usw...
(PRES_OKT == 255 ? $ips = ' 255.x.y.z ... ' : $ips = ''
))))))))))))...)))))))))
Doch dies ist von der Laufzeit schlechter, bei 100.000 Runs
ternaer: 0.380263090134
Was noch bleibt ist switch case. Das kann so aussehen:
CODE:
switch (PRES_OKT) {
case 4: $forbiddenIPs = ' ... '; break;
case 8: $forbiddenIPs = ' ... '; break;
..
}
das spart zwar im Schnitt ca. 6 * 137 Zeichen Quelltext, ist aber nach Messungen geringfuegig langsamer: 100.000 runs
case: 0.273416042328
Was bleibt: ich haette mal wieder Lust auf PHP-bashing
Letzte Kommentare