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.
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?
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 ->
(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
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.
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.
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.
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
——————-
Hi!
Bei meinen Tests kommt bei Doublequotes meist etwas Langsamereres raus. Habe aber auch nur einfache Microtime Tests durchgeführt.
Gruß
Micha
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 😉
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.
Danke dir. Ist korrigiert.
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
Wie sieht es eigtl. dazu im Vergleich mit heredocs und nowdocs aus?
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
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?
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 🙂