Geschwindigkeitsunterschied bei der Verwendung von Inline-Strings vs. Verkettung in PHP5?
Lesezeit: 7 Minuten
Überschwamm
(angenommen, php5) in Betracht ziehen
<?php
$foo = 'some words';
//case 1
print "these are $foo";
//case 2
print "these are {$foo}";
//case 3
print 'these are ' . $foo;
?>
Gibt es einen großen Unterschied zwischen 1 und 2?
Wenn nicht, was ist zwischen 1/2 und 3?
Beachten Sie, dass echo 'these are ', $foo; ist schneller als alle anderen, da es keine Verkettung oder Interpolation gibt.
– Paulus
4. Januar 2012 um 22:25 Uhr
Warum um alles in der Welt ist diese Frage nicht konstruktiv?
– Chris Harrison
23. Juli 2014 um 11:05 Uhr
Keine Ahnung. Es war wirklich eine Seed-Frage, die kurz nach dem Start der Website hinzugefügt wurde, als die Beta-Leute ermutigt wurden, grundlegende Fragen zu posten, die in frühen Google-Suchen auftauchten, selbst wenn sie viel zu einfach waren oder ans Nichts grenzten -Fragebogen. Angesichts der Ansichten und Aktivitäten von Kommentaren und Abstimmungen darin würde ich sagen, dass es ziemlich konstruktiv war, imho.
– Überschwamm
23. Juli 2014 um 14:57 Uhr
Bitte lesen Sie meine Antwort auf eine andere Frage, in der dieses Problem in Kommentaren aufgetreten ist: stackoverflow.com/a/31312867/2893496
– v010dya
9. Juli 2015 um 10:00 Uhr
Einfache Anführungszeichen sind in meinem Szenario schneller. Ich führe asynchrone Log-Parser parallel aus, die Leistungssteigerung in der CPU gab mir die Möglichkeit, mehr Parser parallel auszuführen. In einfachen Anführungszeichen kann ich 144 TB/Stunde analysieren. in doppelten Anführungszeichen kann ich weniger als 95 TB analysieren. Aber Sie müssen es nur überprüfen, wenn Sie bereits alles getan haben, was Sie tun konnten === anstelle von ==, Zeichenfolgenvergleich anstelle von Regex und Tonnen von anderen.
– KodornaRocks
23. Dezember 2015 um 4:03 Uhr
Der Leistungsunterschied war irrelevant seit mindestens Januar 2012 und wahrscheinlich früher:
Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds
Frühere PHP-Versionen hatten möglicherweise einen Unterschied – ich persönlich bevorzuge einfache Anführungszeichen gegenüber doppelten Anführungszeichen, daher war es ein bequemer Unterschied. Das Fazit des Artikels macht einen hervorragenden Punkt:
Vertrauen Sie niemals einer Statistik, die Sie nicht selbst gefälscht haben.
(Obwohl der Artikel den Satz zitiert, war der ursprüngliche Witz wahrscheinlich falsch zugeschrieben an Winston Churchill, erfunden vom Propagandaministerium von Joseph Goebbels, um Churchill als Lügner darzustellen:
Ich traue keiner Statistik, die ich nicht selbst gefälscht habe.
Dies bedeutet frei übersetzt: „Ich vertraue keiner Statistik, die ich nicht selbst gefälscht habe.“)
Wäre das nicht nur eine Prüfung zur Kompilierzeit?
– Kyle Cronin
27. Januar 2009 um 3:03 Uhr
Und obendrein reduzieren Sie durch die Verwendung von weniger Pixeln die Treibhausgasemissionen.
– paxdiablo
27. Januar 2009 um 3:32 Uhr
Da eine schnellere Berechnung weniger CPU-Zeit bedeutet und weniger verbrauchte Watt bedeutet, reduzieren einfache Anführungszeichen wirklich die Treibhausgasemissionen.
– Absturz
27. Januar 2009 um 4:28 Uhr
@Paolo Begantino: Hast du dafür eigentlich einen Beweis? phpbench.com widerspricht Ihnen respektvoll jedes Mal, wenn ich es lade.
– A.Rex
27. Januar 2009 um 5:27 Uhr
Beachten Sie, dass selbst wenn Sie eine Zeichenfolge in einfachen Anführungszeichen verwenden, PHP immer noch jedes darin enthaltene Zeichen analysiert, um nach Escape-Sequenzen usw. zu suchen. PHP analysiert auch das Ganze Dateialso betrachten Sie bestenfalls immer noch O(n) für die Länge der Zeichenfolge.
– Duma
19. Januar 2011 um 16:58 Uhr
Adam Wright
Nun, wie bei allen “Was könnte im wirklichen Leben schneller sein”-Fragen ist ein Test im wirklichen Leben unschlagbar.
Geben Sie ihm ein paar Durchläufe, um alles einzulagern, dann…
0,0035568
0,0035388
0,0025394
Die Interpolation ist also erwartungsgemäß praktisch identisch (Geräuschpegelunterschiede, wahrscheinlich aufgrund der zusätzlichen Zeichen, die die Interpolations-Engine verarbeiten muss). Die reine Verkettung beträgt etwa 66 % der Geschwindigkeit, was kein großer Schock ist. Der Interpolations-Parser wird suchen, nichts zu tun finden und dann mit einer einfachen internen Zeichenfolgenverknüpfung abschließen. Auch wenn die Verkettung teuer wäre, der Interpolator muss es trotzdem tun, nach dem die ganze Arbeit, um die Variable zu analysieren und die ursprüngliche Zeichenfolge zu kürzen/kopieren.
Aktualisierungen von Somnath:
Ich habe Method4() zur obigen Echtzeitlogik hinzugefügt.
Wenn Sie nur eine Zeichenfolge deklarieren und diese Zeichenfolge nicht auch analysieren müssen, warum sollten Sie dann den PHP-Debugger mit der Analyse verwechseln? Ich hoffe, du hast meinen Punkt verstanden.
Sicherlich können Sie einen Test im wirklichen Leben nicht schlagen. Aber dieser künstliche Frankenstein hat nichts mit den realen Bedingungen gemein.
– Ihr gesunder Menschenverstand
16. März 2012 um 10:04 Uhr
Jene Skeptiker, die versuchen, diese Ergebnisse zu reproduzieren (wie ich 😉 auf PHP5+ ändern die microtime() Anrufe zu microtime(true) – Sie möchten die Zeit als Float, nicht als eine Art seltsame Zeichenfolge.
– Erwin Wessels
3. Mai 2013 um 5:14 Uhr
Method4() für String-Verarbeitung hinzugefügt. Und ich denke, dass die PHP-Verarbeitung jetzt schneller geworden ist. @AdamWright
– Somnath Muluk
26. Februar 2015 um 12:29 Uhr
Hallo. Ihr Vergleich geht davon aus, dass es nur eine einzige Instanz der Variablen innerhalb einer Zeichenfolge gibt. Siehe stackoverflow.com/a/31312867/2893496
– v010dya
9. Juli 2015 um 10:00 Uhr
Das verwirrt mich: “ungefähr 66 % der Geschwindigkeit”, ist das nicht “ungefähr 66 % der Zeit”? Ich dachte, die Verkettung ist schneller?
Es gibt tatsächlich einen feinen Unterschied, wenn Variablen mit einfachen oder doppelten Anführungszeichen verkettet werden.
Ich denke, dass es von der Hardwarekonfiguration und dem kompilierten PHP abhängt.
– FDisk
17. Oktober 2011 um 8:32 Uhr
Ich wusste nicht, dass Sie anstelle von Punkten ein Komma in Echo verwenden können.
– Buttle Butkus
3. Januar 2013 um 9:33 Uhr
@ Adams Test verwendet
"these are " . $foo
Beachten Sie, dass Folgendes noch schneller ist:
'these are ' . $foo;
Dies liegt daran, dass ein doppelter “String” in Anführungszeichen ausgewertet wird, während ein einfacher “String” in Anführungszeichen genommen wird, wie er ist …
Jake McGraw
Lassen Sie sich nicht zu sehr auf den Versuch ein, String-Operationen in PHP zu optimieren. Verkettung vs. Interpolation ist bedeutungslos (in der realen Weltleistung), wenn Ihre Datenbankabfragen schlecht geschrieben sind oder Sie kein Caching-Schema verwenden. Schreiben Sie Ihre Zeichenfolgenoperationen so, dass das spätere Debuggen Ihres Codes einfach ist und die Leistungsunterschiede vernachlässigbar sind.
@uberfuzzy Angenommen, dies ist nur eine Frage zu Sprachminutien, nehme ich an, dass es in Ordnung ist. Ich versuche nur, der Konversation hinzuzufügen, dass der Vergleich der Leistung zwischen einfachen Anführungszeichen, doppelten Anführungszeichen und Heredoc in realen Anwendungen bedeutungslos ist, wenn man sie mit den echten Leistungseinbußen vergleicht, wie z. B. schlechten Datenbankabfragen.
Gordon
Etwaige Unterschiede in der Ausführungszeit sind völlig vernachlässigbar.
Verschwenden Sie keine Zeit mit solchen Mikrooptimierungen. Verwenden Sie einen Profiler, um die Leistung Ihrer Anwendung in einem realen Szenario zu messen und dann dort zu optimieren, wo sie wirklich benötigt wird. Das Optimieren einer einzigen schlampigen DB-Abfrage führt wahrscheinlich zu einer größeren Leistungsverbesserung als das Anwenden von Mikrooptimierungen auf den gesamten Code.
KJYe.Name
Es gibt einen Unterschied beim Verketten von Variablen … und was Sie mit dem Ergebnis tun … und ob Sie es zur Ausgabe ausgeben, ob die Ausgabepufferung aktiviert ist oder nicht.
auch, was ist die Speichersituation des Servers? Typischerweise ist die Speicherverwaltung auf einer höheren Plattform schlechter als auf niedrigeren Plattformen …
$a="parse" . $this;
verwaltet den Speicher auf der Ebene der Benutzercodeplattform …
$a = "parse $this";
verwaltet den Speicher auf der Ebene der PHP-Systemcode-Plattform …
Daher erzählen diese Benchmarks in Bezug auf die CPU nicht die ganze Geschichte.
Wenn Sie den Benchmark 1000 Mal ausführen oder den Benchmark 1000 Mal auf einem Server ausführen, der versucht, dieselbe Simulation 1000 Mal gleichzeitig auszuführen, können Sie je nach Umfang der Anwendung drastisch unterschiedliche Ergebnisse erhalten.
Plus 1 für „typischerweise ist die Speicherverwaltung auf einer höheren Plattform schlechter als die auf niedrigeren Plattformen…“
– Hamid Sarfraz
1. Januar 2013 um 2:43 Uhr
9633400cookie-checkGeschwindigkeitsunterschied bei der Verwendung von Inline-Strings vs. Verkettung in PHP5?yes
Beachten Sie, dass
echo 'these are ', $foo;
ist schneller als alle anderen, da es keine Verkettung oder Interpolation gibt.– Paulus
4. Januar 2012 um 22:25 Uhr
Warum um alles in der Welt ist diese Frage nicht konstruktiv?
– Chris Harrison
23. Juli 2014 um 11:05 Uhr
Keine Ahnung. Es war wirklich eine Seed-Frage, die kurz nach dem Start der Website hinzugefügt wurde, als die Beta-Leute ermutigt wurden, grundlegende Fragen zu posten, die in frühen Google-Suchen auftauchten, selbst wenn sie viel zu einfach waren oder ans Nichts grenzten -Fragebogen. Angesichts der Ansichten und Aktivitäten von Kommentaren und Abstimmungen darin würde ich sagen, dass es ziemlich konstruktiv war, imho.
– Überschwamm
23. Juli 2014 um 14:57 Uhr
Bitte lesen Sie meine Antwort auf eine andere Frage, in der dieses Problem in Kommentaren aufgetreten ist: stackoverflow.com/a/31312867/2893496
– v010dya
9. Juli 2015 um 10:00 Uhr
Einfache Anführungszeichen sind in meinem Szenario schneller. Ich führe asynchrone Log-Parser parallel aus, die Leistungssteigerung in der CPU gab mir die Möglichkeit, mehr Parser parallel auszuführen. In einfachen Anführungszeichen kann ich 144 TB/Stunde analysieren. in doppelten Anführungszeichen kann ich weniger als 95 TB analysieren. Aber Sie müssen es nur überprüfen, wenn Sie bereits alles getan haben, was Sie tun konnten === anstelle von ==, Zeichenfolgenvergleich anstelle von Regex und Tonnen von anderen.
– KodornaRocks
23. Dezember 2015 um 4:03 Uhr