Geschwindigkeitsunterschied bei der Verwendung von Inline-Strings vs. Verkettung in PHP5?

Lesezeit: 7 Minuten

1646632450 650 Geschwindigkeitsunterschied bei der Verwendung von Inline Strings vs Verkettung in PHP5
Ü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


1646632452 814 Geschwindigkeitsunterschied bei der Verwendung von Inline Strings vs Verkettung in PHP5
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.

  • 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?

    – datasn.io

    8. November 2015 um 12:27 Uhr

Live-Benchmarks:

http://phpbench.com/

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 …

1646632453 155 Geschwindigkeitsunterschied bei der Verwendung von Inline Strings vs Verkettung in PHP5
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.

1646632454 948 Geschwindigkeitsunterschied bei der Verwendung von Inline Strings vs Verkettung in PHP5
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.

1646632455 614 Geschwindigkeitsunterschied bei der Verwendung von Inline Strings vs Verkettung in PHP5
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

963340cookie-checkGeschwindigkeitsunterschied bei der Verwendung von Inline-Strings vs. Verkettung in PHP5?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy