Gleich zwei Sachen in einem. Ich muss oft an alten Code. Mal muss ich dort eine neue Funktion implementieren, mal ein Bugfix durchführen, usw. usw. Kennen viele von euch. Derzeit muss ich an alten Code, um ein altes Projekt mit vielen neuen Features auszustatten.
„Dabei könnte ich doch gleich mal an der Performace-Schraube drehen…“
…denke ich mir so und nachdem ich viele offensichtliche Bremsen entfernt habe wende ich mich dem Profiling-Report aus dem Zend Studio zu. Nach einiger Zeit kommt in mir eine interessante Frage auf. Da im Code an vielen Stellen solche Konstrukte verwendet werden:
Datei1.php
function getDBName() { return 'meinDBName'; }
Datei2.php
$dbName = getDBName();
Ich denke mir intuitiv: Konstanten wären schneller, aber solch eine Vermutung ist schnell geäußert – Beweise müssen her. Und da ich schon dabei bin und das Projekt noch eins von den echo-HTML Projekten ist (habe ich erwähnt, dass es schon älter ist?), kommt gleich die nächste Frage: echo oder printf?
Meine Vermutung: Aufrufe von Konstanten und die Verwendung von printf ist die schnellste Variante!
Hier also mein Test-Code:
$rounds=999;
function getStringOne() { return 'Hallo'; }
function getStringTwo() { return 'Welt'; }
define("StringONE", 'Hallo');
define("StringTWO", 'Welt');
$start=microtime(1);
for ($i=0;$i<$rounds;$i++)
echo getStringOne() . ' ' . getStringTwo() . " - ";
$endFunction1=microtime(1);
for ($i=0;$i<$rounds;$i++)
printf('%s %s - ',getStringOne(),getStringTwo());
$endFunction2=microtime(1);
for ($i=0;$i<$rounds;$i++)
echo StringONE . ' ' . StringTWO . " - ";
$endConstant1=microtime(1);
for ($i=0;$i<$rounds;$i++)
printf('%s %s - ',StringONE,StringTWO);
$endConstant2=microtime(1);
printf("Rounds: %u\n",$rounds);
printf("Funktion echo: %f\n",($endFunction1-$start));
printf("Funktion printf: %f\n",($endFunction2-$endFunction1));
printf("Konstanten echo: %f\n",($endConstant1-$endFunction2));
printf("Konstanten printf: %f\n",($endConstant2-$endConstant1));
exit;
Und das Ergebnis:
Funktion echo: 0.025293
Funktion printf: 0.024530
Konstanten echo: 0.017224
Konstanten printf: 0.017751
Meine erste Vermutung – Konstanten sind schneller als Funktionen – hat sich bewahrheitet; meine zweite Vermutung – printf ist schneller als echo – nur zum Teil. Ich bekomme da zum Teil Ergebnisse nach dem Motto "e;Mal so, mal so"e; und kann das nun an diesem Code nicht eindeutig beantworten. In einer Variante habe ich die Rundenzahl auf 99.999 erhöht und in diesem Test waren alle Aufrufe mit printf langsamer als die echo-Varianten, allerdings nicht wirklich signifikant.
Die Frage echo oder printf ist wohl eher eine Geschmacksfrage; für mich im aktuellen Projekt heißt das: Die echo’s können bleiben, es bringt mehr, meine Zeit auf die „Entfunktionalisierung“ zu verwenden.