IPC 2014

Gänsefüßchen oder Hochkomma?

Im Web liest man recht oft, dass PHP-Ausgaben, die in Hochkommata eingeschlossen werden, etwas schneller gehen als die Variante in Gänsefüßchen. Eigentlich ist die Gänsefüßchen-Variante aus meiner Sicht "richtiger" von der Syntax her, da Strings in vielen Programmiersprachen in eben diesen Zeichen eingeschlossen werden. Dort sind Singlequotes (Hochkommata) für den Datentyp char (ein einzelnes Zeichen) zuständig. Aber nicht zuletzt auf Wunsch der in den Kommentaren zur Einbettung oder Konkatenierung von Variablen in Strings möchte ich diesem Phänomen einen eigenen Beitrag widmen.

Nur, damit jeder weiß, worum es hier gehen soll:

// Doublequote-Variante
echo "Hallo, der aktuelle Timestamp ist ".time().".";
 
//Singlequote-Variante
echo 'Hallo, der aktuelle Timestamp ist '.time().'.';

Im Benchmark selbst wird ein längerer String mit mehr Variablen verwendet, damit ein signifikantes Ergebnis zustandekommt.

Das Ergebnis widerspricht vielleicht vielen Meinungen, die man im Internet so liest, aber die beziehen sich vermutlich auf frühere PHP-Versionen. In diesem Test wurde PHP 5.1 verwendet.

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
var_out_of_string.php 132.810973 s 13.281 ms 100 %
var_out_of_string_ singlequote.php 136.205855 s 13.621 ms 103 % (+ 3%)

Tatsächlich ist die Singlequote-Variante hier etwas langsamer. Ich selbst nutze schon lange Doublequotes, eben aus oben genannten Gründen, wie es bei anderen Programmiersprachen gehandhabt wird, weniger wegen der besseren Performance. Über die Gründe, warum Doublequotes etwas schneller sind, mag ich nicht zu mutmaßen – oder anders gesagt: ich habe keine Ahnung ;-)

Diese minimalen Geschwindigkeitsvorteile sollten aber nicht zum Umschreiben vorhandener Anwendungen führen. Lediglich für die Zukunft kann man sich durchaus auf die Doublequote-Variante besinnen.

Zum Selbsttest und Nachvollziehen der Ergebnisse gibts hier noch die Quellcodes und die Benchmark-Ergebnisse.

Die abschließende Hoffnung, die ich in vielen meiner Beiträge äußere: Ich hoffe, dass ich ihr Weltbild mit diesen Äußerungen nicht verdreht habe ;-)

PS: Ich habe es nochmal mit dem Komma als Konkatenierungszeichen probiert. Hier die Ergebnisse dazu:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
var_out_of_string_ komma.php 132.790944 s 13.279 ms 100 %
var_out_of_string.php 138.629340 s 13.863 ms 104 % (+ 4%)

Das Komma ist demzufolge tatsächlich etwas schneller als der Punkt. Auch zu diesem "Nachtest" gibts natürlich die Quelltexte und die Benchmarkergebnisse. Die Unterschiede zu den Zeiten in der oberen Tabelle sind darin begründet, dass ich zum Nachtest den Rechner bereits länger hab laufen lassen (den halben Arbeitstag etwa) und dadurch der Speicher schon etwas voller war. Die jeweiligen Unterschiede in den Ausführungszeiten pro Tabelle sind aber unter gleichen Bedingungen erfolgt.


Schlagwörter: , ,

21 Kommentare bisher »

  1. Frank sagt

    am 23. Mai 2007 @ 10:15

    Herzlichen Dank für den Beitrag, auch wenn es mein Weltbild in Sachen PHP über den Haufen schmeist.

    Besinnen wir nus nun wieder den Dpublequotes und dem Komma und weichen dabei von den Richtlinien ab, oder arbeiten wir wie gewohnt?

  2. soulrebel sagt

    am 23. Mai 2007 @ 12:07

    Hi!

    Bitte aber nicht verwechseln, es gibt 4 verschieden Möglichkeiten Strings zu schreiben.

    1) Mit Singlequotes -> '
    2) Mit Doublequotes -> "
    3) Mit Backticks (die du da anscheinend gerade verwendest) -> ` (Link)
    4) Mit Herodecs ->

  3. soulrebel sagt

    am 23. Mai 2007 @ 12:09

    (hier gehts weiter, herodecs mag dein blog nicht)
    hier zu finden: Link

    Auch ich war bis jetzt immer in dem festen Glauben mit Singlequotes am besten dran zu sein, aber man kann in der PHPDOKU nachlesen dass es von Fall zu Fall verschieden ist. Abhängig davon wie viele Variabeln man konkatieren oder einbetten möchte.

    Lg.

    Andreas

  4. admin sagt

    am 23. Mai 2007 @ 20:26

    Nein, ich habe keine Backticks verwendet. Das macht nur die Code-Highlighting-Funktion aus Hochkommata. Um genau zu sehen, was verglichen wurde, empfehle ich das Herunterladen der Quelltexte.

    Kannst Du die URL für die Geschwindigkeitsunterschiede in Abhängigkeit der Variablenanzahl in der PHP-Doku nennen? Besonders Begründungen, wie diese Unterschiede zustande kommen, würden mich interessieren.

  5. Richard Ritschel sagt

    am 29. Mai 2007 @ 13:44

    Hallo zusammen,

    der eigentliche Grund, warum Singlequotes performanter sein sollen als Doublequotes ist der, dass der Parser den Möglichkeiten von PHP entsprechend dreimal in einen Doublequote-String schaut:

    Runde 1: Ist evtl. eine Konstante enthalten?
    Runde 2: Ist evtl. eine Variable enthalten?
    Runde 3: Alles andere ist also ein String.

    Bei dem Singlequote-String ist von vorneherein klar, dass es sich um einen String handelt – der Parser braucht also nur eine Runde.

    Daher vermute ich, dass durch die sehr viel bessere Hardware und die allgmein verbesserte Performance von PHP gegenüber früher, der direkt sichtbare Vorteil kaum, bzw. gar nicht spürbar ist. Hinzu kommen mögliche Messfehler und die Tatsache, dass 1.000 Umdrehungen sehr wenig sind, wenn ein repräsentatives Ergebnis erreicht werden soll.

  6. admin sagt

    am 29. Mai 2007 @ 13:55

    Nun, eigentlich ist die Funktionalität von Singlequotes der von Doublequotes genau gleich. Die 3 Sachen, die Du aufgezählt hast, sind auch mit Singlequotes möglich
    echo 'Hallo $name';
    Das funktioniert ja auch.

    Und zu der Kritik bezüglich meiner Messmethoden: Ich empfehle dir die Benchmark-Ergebnisdateien, die ich verlinkt habe, herunterzuladen. Darin wirst Du feststellen, dass sich in jedem Script eine Schleife befindet, die 1000 mal ausgeführt wird. Und um eventuelle Abweichungen zu vermeiden, wird jedes Script 10000 mal ausgeführt. Insgesamt sind es also 1000*10000 Ausgaben pro Script. Und da tritt bestimmt kein signifikanter Zufallseinfluss merh zutage.

  7. Richard Ritschel sagt

    am 30. Mai 2007 @ 10:57

    Danke für die schnelle Antwort. Was den Benchmark angeht, hast du Recht – das war mir nicht gleich aufgefallen.

    Zur Funktionalität von
    ——————-
    $name = ‘Richard‘;
    echo 'Hallo $name';
    ——————-
    muss ich widersprechen, da die Variable $name nicht geparst wird. Die Ausgabe ist folgende:
    ——————-
    Hallo $name
    ——————-

  8. Micha sagt

    am 12. Juni 2007 @ 13:42

    Hi!
    Bei meinen Tests kommt bei Doublequotes meist etwas Langsamereres raus. Habe aber auch nur einfache Microtime Tests durchgeführt.

    Gruß
    Micha

  9. PHP Performance von Single- oder Doublequotes | bueltge.de [by:ltge.de] sagt

    am 23. Juni 2007 @ 10:18

    [...] hat sich das Blog PHP Performance ausgiebig mit der Analyse der beiden unterschiedlichen Syntax auseinandergesetzt und das Ergebnis [...]

  10. links for 2007-06-24 | Patrick Kempf sagt

    am 24. Juni 2007 @ 02:21

    [...] Gänsefüßchen oder Hochkomma? Im Web liest man recht oft, dass PHP-Ausgaben, die in Hochkommata eingeschlossen werden, etwas schneller gehen als die Variante in Gänsefüßchen. (tags: php performance) No Tags Gelesen: 1 / heute: 1 [...]

  11. PHP: Single Quotes oder Double Quotes? — Software Guide sagt

    am 25. Juni 2007 @ 23:44

    [...] hat sich mit dem Thema noch mal neu auseinandergesetzt und Performance-Tests gemacht. Dabei kam doch tatsächlich heraus, dass PHP-Ausgaben, die in Hochkommata eingeschlossen werden, etwas schneller gehen als die [...]

  12. Sebbi sagt

    am 26. Juni 2007 @ 02:44

    Zunächst einmal sind 10000 Skriptaufrufe, die jeweils 1000 Schleifendurchgänge haben natürlich Schmarrn. Dadurch muss der Interpreter ja 10000 mal gestartet werden und das System spielt wieder eine viel zu große Rolle.

    Also gleich 10 Mio Schleifendurchgänge und heraus kommt …

    time php src/var_out_of_string.php > /dev/null
    real 1m17.234s
    user 1m10.988s
    sys 0m3.488s

    time php src/var_out_of_string_singlequote.php > /dev/null
    real 1m16.646s
    user 1m12.157s
    sys 0m3.592s

    Das waren die beiden jeweils schnellsten von jeweils 3 Durchläufen und auf meinem System scheint es wohl so zu sein, dass Singlequotes erwartungsgemäß schneller sind. Auch wenn es überraschend ist, dass Doublequotes so gut mithalten können.

    Zum Vergleich nochmal 10 Mio Durchgänge ohne Concats (also statt "text ".$variable." text" einfach "text $variable text"):

    time php src/var_out_of_string_noconcat.php > /dev/null
    real 1m53.742s
    user 1m47.659s
    sys 0m2.884s

    Man sollte es also vermeiden Variablen in Gänsefüßchen stehen zu haben ;-)

  13. To Whom It Concerns … » Single oder Double Quoted Strings sagt

    am 17. September 2007 @ 07:46

    [...] kursierte aber das Gerücht (vgl. auch auf bueltge.de, bei Patrick Kempf oder im Software-Guide), dass es [...]

  14. Leif sagt

    am 17. September 2007 @ 09:24

    Tippfehler:
    "Tatsächlich ist die Singlequote-Variante hier etwas langsamer. [...] Über die Gründe, warum Singlequotes etwas schneller sind, mag ich nicht zu mutmaßen"

    Muss "Doublequotes" heißen.

  15. admin sagt

    am 17. September 2007 @ 09:35

    Danke dir. Ist korrigiert.

  16. PHP Performance von Single- oder Doublequotes, Part 2 | bueltge.de [by:ltge.de] sagt

    am 17. September 2007 @ 09:39

    [...] sich mein Weltbild beim Schreiben von PHP-Code ändern müsste. Denn die Analyse des Blog PHP-Performance, der sich ausgiebig und übersichtlich mit Performance im Bereich PHP beschäftigt, ergab [...]

  17. alex sagt

    am 8. Juni 2008 @ 23:03

    hmmm ich muss hier widersprechen.
    meine tests ergaben genau das gegenteil.

    der unterschied ist, dass php bei normalen anführungszeichen nach variablen innerhalb des strings sucht. beispiel:
    $text = "hallo $name";
    das funktioniert hier nicht: $text = 'hallo $name';

    $text = 'irgendeintext'; ist nach meinen tests über 30% schneller als $text = "irgendeintext"; (php 5.2.5)

    lg

  18. Thomas sagt

    am 9. August 2008 @ 12:32

    Wie sieht es eigtl. dazu im Vergleich mit heredocs und nowdocs aus?

  19. Jakob Stoeck sagt

    am 19. Dezember 2008 @ 18:19

    Stimmt leider nicht (mehr?)

    Nach meinen Tests mit PHP5 kommt folgendes heraus:
    Dabei stimmt es, dass bei 1000 Schleifendurchläufen tatsächlich manchmal Doublequotes schneller sind (allerdings manchmal auch langsamer). Erhöht man die Anzahl der Durchläufe aber werden die Doublequotes sehr viel langsamer:

    Wiederholung: 1000
    Single: 0.0102920532227
    Double: 0.0177829265594

    Difference: -0.00749087333679

    Wiederholung: 10000
    Single: 0.0120141506195
    Double: 0.162938117981

    Difference: -0.150923967361

    Wiederholung: 100000
    Single: 0.0210609436035
    Double: 2.88630700111

    Difference: -2.86524605751

    Wiederholung: 200000
    Single: 0.0654091835022
    Double: 6.6405518055

    Difference: -6.57514262199

  20. Jan sagt

    am 19. Dezember 2008 @ 18:36

    Toll, dass Du das nochmal getestet hast. Dann waren nur die Wiederholungen zu wenig. Dann scheinen die Double-Quotes speicherintensiver zu sein oder woran liegts, dass die bei mehr Wiederholungen so viel langsamer sind?

  21. tybae sagt

    am 14. März 2012 @ 19:12

    Hi…
    Ich glaube du meinst bei den Tests nicht Sekunden, sondern Millisekunden ;) Hab den gleichen Test auch durchgeführt und hab das gleiche Gesamtergebnis auf meinem localhost in Millisekunden bekommen :)

Komentar RSS · TrackBack URI

Hinterlasse einen Kommentar

Name: (erforderlich)

eMail: (erforderlich)

Website:

Kommentar: