
Ü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?
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.“)

Adam Wright
Nun, wie bei allen “Was könnte im wirklichen Leben schneller sein”-Fragen ist ein Test im wirklichen Leben unschlagbar.
function timeFunc($function, $runs)
{
$times = array();
for ($i = 0; $i < $runs; $i++)
{
$time = microtime();
call_user_func($function);
$times[$i] = microtime() - $time;
}
return array_sum($times) / $runs;
}
function Method1()
{
$foo = 'some words';
for ($i = 0; $i < 10000; $i++)
$t = "these are $foo";
}
function Method2()
{
$foo = 'some words';
for ($i = 0; $i < 10000; $i++)
$t = "these are {$foo}";
}
function Method3()
{
$foo = 'some words';
for ($i = 0; $i < 10000; $i++)
$t = "these are " . $foo;
}
print timeFunc('Method1', 10) . "\n";
print timeFunc('Method2', 10) . "\n";
print timeFunc('Method3', 10) . "\n";
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.
function Method4()
{
$foo = 'some words';
for ($i = 0; $i < 10000; $i++)
$t="these are " . $foo;
}
print timeFunc('Method4', 10) . "\n";
Results were:
0.0014739
0.0015574
0.0011955
0.001169
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.
Live-Benchmarks:
http://phpbench.com/
Es gibt tatsächlich einen feinen Unterschied, wenn Variablen mit einfachen oder doppelten Anführungszeichen verkettet werden.
@ 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.
Bitte sehen
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.
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