funktionen vs konstanten ; echo vs printf

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.

5 Gedanken zu „funktionen vs konstanten ; echo vs printf

  1. Anonymous

    Ich weiß ja nicht auf was für Krücken du testest 😉 aber auf meiner Krücke sind das völlig andere Zeiten:

    Funktion echo: 0.002495
    Funktion printf: 0.003072
    Konstanten echo: 0.002530
    Konstanten printf: 0.005224

    Ich weiß ist nicht konstruktiv aber ich dachte bisher immer dass ich auf langsamen Maschinen arbeite 😛

    Antworten
  2. Sascha Presnac

    *hm* Ich seh grad, dass ich im Code 999 Runden stehen habe, die Ergebnisse sich aber auf 9.999 Runden beziehen.
    @Anonym: Nimm dein Ergebnis mal 10 und schau nochmal nach. Wir haben doch alle nur Krücken, oder 😉

    Antworten
  3. dag

    Ehrlich gesagt glaube ich dass eine solche „optimierung“ nur in den allerwenigsten Fällen überhaupt etwas bringt.. nach meiner erfahrung ist php in den seltensten fällen der flaschenhals und wenn dann besteht oftmals ein grundlegenderes problem als eine der konstanten vs funktionen, „“ vs “ oder echo vs print thematiken.. opcode cache und ein gutes codedesign (was natürlich bei älteren projekten nicht ohne grossen aufwand möglich ist) setzen da an imho an einer sinnvolleren stelle an.

    Antworten
  4. Anonymous

    @dag: ACK. Zusammengefasst heißt das, selbst wenn die Konstante 100 mal abgefragt wird, hast du einen Gewinn von 1 (einer!) Millisekunde. War das den „Optimierungs“-Aufwand wert? Diese Diskussionen a la „echo vs print“ gehen doch meist total an den realen Problemen vorbei.

    Antworten
  5. Anonymous

    Solche „Tests“ sind prinzipiell immer total sinnlos, da man es nicht anhand von Feldtests untersuchen kann, sondern sich die Arbeit „unter der Haube“ ansehen muss, sprich den C-Code von PHP. Es kann z.B. sein, dass das ganze auch wieder varriiert, je nach dem wie groß z.B. der Inhalt der Konstante bzw. des Rückgabewertes ist, wie sich mehrfache Ausführung positiv oder negativ auf die Zeit ausführt, usw.

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert