
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.
TwitternSchlagwörter: ausgabe, echo, PHP
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?
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 ->
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
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.
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.
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.
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
——————-
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
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 [...]
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 [...]
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 [...]
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
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 [...]
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.
admin sagt
am 17. September 2007 @ 09:35
Danke dir. Ist korrigiert.
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 [...]
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
Thomas sagt
am 9. August 2008 @ 12:32
Wie sieht es eigtl. dazu im Vergleich mit heredocs und nowdocs aus?
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
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?
tybae sagt
am 14. März 2012 @ 19:12
Hi…
Hab den gleichen Test auch durchgeführt und hab das gleiche Gesamtergebnis auf meinem localhost in Millisekunden bekommen
Ich glaube du meinst bei den Tests nicht Sekunden, sondern Millisekunden