Variablen in String einbetten oder konkatenieren

In PHP kann man Variablen auf zwei unterschiedliche Arten in einen String einbauen.

$zeit = time();
// Variable im String
echo "Der aktuelle UNIX-Timestamp ist $zeit.";
 
// Variable konkateniert
echo "Der aktuelle UNIX-Timestamp ist ".$zeit.".";

Ich finde die zweite Variante sauberer, da sie die Variablen eindeutig vom String trennt, trotzdem möchte ich aber – nicht zuletzt angestoßen durch soulrebels Beitrag im Forum mal untersuchen, inwiefern sich beide Arten in der Performance unterscheiden.

Ich will nicht lang drumrumreden, sondern direkt das Ergebnis präsentieren:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
var_out_of_ string.php 27.359341 s 2.736 ms 100%
var_out_of_ string_singlequote.php 27.759916 s 2.776 ms 101 % (+ 1%)
var_in_string.php 29.492408 s 2.949 ms 108 % (+ 8%)

Die Konkatenierungsvariante ist also nicht nur sauberer sondern auch schneller (wenn es auch kein wirklich großer Unterschied ist).

Nun, wodurch kommt das? Es ist nur eine Mutmaßung, aber ich kann mir vorstellen, dass jedes Zeichen des Strings einzeln untersucht werden muss und dadurch das Parsen mit einem regulären Ausdruck beim direkten Einbetten in den String länger dauert, denn der Parser weiß ja, wenn er auf $z stößt, erstmal noch nicht, ob der Variablenname danach noch weiter geht. Deshalb holt er sich Stück für Stück noch das e, i und t und stößt danach auf einen Punkt (.), der in PHP-Variablennamen nicht vorkommen darf. Erst dann weiß er, wie der Variablenname heißt – nämlich $zeit – und kann den Wert dieser Variablen an diese Stelle einbauen.

Wenn man die Variable an den String konkateniert, steht sofort für den Parser fest, welche Variable gemeint ist. Und genau da ist dann auch der Geschwindigkeitsunterschied begründet.

Also sowohl der besseren Lesbarkeit als auch der Geschwindiskeit wegen empfehle ich Variablen in Strings zu konkatenieren statt sie einzubetten.

Zum Nachvollziehen: die Quellcodes zu diesem Beitrag sowie die Benchmark-Ergebnisse.

Jan hat 152 Beiträge geschrieben

24 Kommentare zu “Variablen in String einbetten oder konkatenieren

  1. G.P. sagt:

    Mit folgenden Code sollte es sogar noch etwas schneller sein 😉

    echo ‚Der aktuelle UNIX-Timestamp ist ‚.$zeit.‘.‘;

  2. Heiko K. sagt:

    Ich finde die zweite Variante auch schöner und code so schon seit ich es kann.
    Allerdings sollte das ganze so aussehen, wenn wirklich „richtig“ sein soll: *gg*

    echo „Der aktuelle UNIX-Timestamp ist „.$zeit;

  3. admin sagt:

    @ G.P.: Werde ich gleich mal testen. Habe das auch schon oft im Internet gelesen, aber denke, dass das in aktuellen PHP-Versionen keinen Unterschied mehr macht.
    PS: Habe die Ergebnisse zu dem Beitrag hinzugefügt mit den Singlequotes. Du siehst, dass es mit Singlequotes nicht schneller geht. Zumal es auch aus meiner Sicht unsauberer ist, da in anderen Programmiersprachen der Singlequote für einzelne char-Objekte gedacht ist, Strings werden überall in Gänsefüßchen geschrieben.

    @ Heiko: Nein, denn es ist ja ein deutscher Satz und da gehört der Punkt ans Ende 😉 Habe ich extra so gemacht, damit der String auch wirklich eingebettet ist und nicht ganz am Ende steht. Außerdem wurde mit einem etwas anderen Satz gestestet, schau mal in die angehängten Quelltexte (aber der Text spielt auch keine Rolle, solange er bei allen 3 Dateien der gleiche ist).

  4. Christian sagt:

    Hi,
    ich finde es echt toll das du immer die Performance-Tests mit reinbringst (was natürlich auch zu erwarten ist beim Domainnamen 🙂 ).

    Mich würde mal interessieren wie Otto-PHP-Normaluser solche Tests sauber und unverfälscht hinbekommt, könntest du dazu mal was schreiben? Fände ich super!
    Gruß Chris

  5. admin sagt:

    Ganz sauber geht es meiner Meinung nach nur über das Apache Benchmark Tool, das ich nutze. Mit PHP selbst ist kein sauberer Test möglich, da die Testfunktion dann ja ebenso mit anderen PHP-Scripts konkurriert. Dazu habe ich mir noch ein kleines Shell-Script gebastelt für diese tollen Tabellen, damit ich die nicht immer von Hand entwickeln muss und das wars auch schon.

    Falls dir Unterschiede im Millisekundenbereich egal sind, empfehle ich dir den Beitrag über einen PHP-Profiling-Script.

  6. Frank sagt:

    Mit Singlequotes wird es tatsächlich schneller und sauberer, siehe Beitrag.

    Die Zeichen innerhalb von Singlequotes (‚) müssen nicht geparst werden. Die Zeichen müssen nicht maskiert werden, wie bei der Verwendung von Doublequotes („).

    LG und danke für die tollen Beiträge

  7. admin sagt:

    Wie kommst Du darauf, Frank? Oder anders gefragt: Was muss denn bei den Doublequotes maskiert werden? Der Benchmark spricht doch eigentlich eine eindeutige Sprache – oder habe ich im Quelltext irgendwas anders als du es meinst?

  8. Frank sagt:

    Nein, du hast es genauso – die Lösung ist noch ein wenig schneller:
    echo ‚Der aktuelle UNIX-Timestamp ist ‚ . $zeit . ‚.‘;

    als mit „.

  9. admin sagt:

    Na schau mal in die angehängten Quellcodes. Da habe ich doch ein Singlequote-Beispiel gemacht und es auch mit durch den Benchmark gejagt. Und es ist minimal langsamer (siehe Tabelle).

  10. Jo sagt:

    netter Beitrag.
    Wie siehts dann mit printf() aus im direkten Vergleich?

    printf(‚Der aktuelle UNIX-Timestamp ist %d.‘, time());

  11. Frank sagt:

    stimmt, dann ist mein aktueller Wissensstand mit deinem Benchmark über den Hauden geworfen. Ich dachte immer, dass Singlequotes schneller ist, weil sie nicht geparst werden müssen.

  12. Frank sagt:

    Habe auch nochmal einen Benchmark gefahren und muss leider deine Werte bestätigen.
    Wechseln wir nun wieder zu Doublequote?

    jedenfalls danke ich für die tollen beiträge, vorallem die Idee die Klasse Profile zu nutzen.

  13. G.P. sagt:

    Das finde ich doch recht erstaunlich, dass Singlequotes langsamer sind.
    Kannst du das ganze mal mit einen etwas laengeren Text und ein paar mehr Variabeln probieren?
    Wuerde mich echt Interresieren, ob sich das Ergebnis mit deinem obrigen Ergebnis deckt.

  14. Artemis sagt:

    Könntest du auch noch untersuchen, ob ein

    echo ‚Aktuelle Zeit: ‚, $zeit;

    schneller ist, als ein

    echo ‚Aktuelle Zeit: ‚ . $zeit;

    ?

  15. Berthold sagt:

    Wenn im Text, respektive HTML-Code, Anführungszeichen stehen, ist die single-quote Methode sicher schneller, weil keine Slashes zum Maskieren berücksichtigt werden
    müssen:

    echo“;

    echo““;

    Mal noch was anderes. Kannst Du mal testen, was hier perfomanter ist?

    jede Menge irgendwas …

    oder

    jede Menge irgendwas … „;
    }?>

    Gruß, Berthold

    p.S. sorry für das mehrfachposting

  16. admin sagt:

    Leider kam nicht an, was Du sagen wolltest (trotz [code]).

    Ah, hab nun gesehen, was DU meinst. Der Unterschied, ob Ausgaben in einer Verzweigung per PHP-Echo ausgegeben werden sollen oder der PHP-Block einfach beendet und per HTML die Ausgabe gemacht werden soll. Hier ist auf jeden Fall die Variante ohne PHP schneller, denn solche Dinge wie dass ariablen in Strings stehen können ist Gift für die Performance. Kann ich aber gern noch nen Beitrag drüber machen in den nächsten Tagen…

    Mit dem Maskieren kommt ja auch immer drauf an, ob man in HTML einfache Hochkommata oder Gänsefüßchen verwendet. Beides ist HTML-valide.

  17. Björn sagt:

    Hallo,

    Ich bin echt überrascht das die einfachen Hochkommata nicht schneller sind als die Gänßefüßchen. Ich habe bisher immer von drweb.de wie es dort stand einmal geglaubt das die einfachen Hochkommata schneller sind.

    Was mich dabei interessieren würde. Ständiges öffnen und beenden des PHP-Interpreters nur um eine Html-Ausgabe zu machen, wie dies sich verhält gegenüber den echo´s.

  18. admin sagt:

    Zu dem ständigen Öffnen und Schließen von PHP-Blöcken ist bereits ein Artikel in Arbeit. Wird wohl morgen erscheinen…

  19. Tim sagt:

    Mich wundert, dass bei dir Single Quotes langsamer sind als Double Quotes. Ich habe vor einigen Jahren selbst einen Vergleich gemacht und Singlequotes war deutlich schneller. Auch im Internet habe ich das öfters gelesen. Seitdem benutze ich nur noch Single Quotes. Anscheinend hat sich das während der Entwicklung von PHP geändert. Folgender Benchmark kommt (leider) zu dem gleichen Ergebnis:
    http://benchmark.nophia.de/benchmarks-textverarbeitung-k-2-single-quotes-oder-double-quotes-teil-1-b-3.html

    Anscheinend muss ich jetzt alle meine Scripts umschreiben.

    Gruß
    Tim

  20. GhostGambler sagt:

    Der Unterschied zwischen doppelte und einfachen Anführungszeichen ist so marginal, dass die Neuprogrammierung aller existierender Skripten in keinem adäquaten Verhältnis zum Resultat steht.
    Mal abgesehen davon, dass sich solch Benchmarks mit jeder neuen Version sofort wieder invertieren können – dann wieder alles zurück ändern?…

Eine Antwort schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert mit *

You may use these HTML tags and attributes: <a href=""> <blockquote cite=""> <pre lang=""> <b> <strong> <i> <em>