[PHP] Stringkonkatenation: welche Art der Konkatenation ist performanter/besser/gängiger
-
Hallo!
Mir ist klar dass es wesentlich schwerwiegendere Probleme auf der Welt gibt als dieses, und dass ich damit im Grunde nichtmal eine Zehntelsekunde Laufzeit aus meinen Skripten rausquetschen kann, aber trotzdem: Ich überdenke gerade meinen persönlichen Code-Style guides, und da frag ich mich jetzt, was eigentlich der bessere Weg ist, 'hardcoded' Strings mit Strings in Variablen zu konkatenieren:
$foo = 'Welt!'; $bar = array('answer'=>42); // 1. Variante: $a1 = 'Hallo, ' . $foo; $b1 = 'The answer is ' . $bar['answer']; // 2. Variante: $a2 = "Hallo, $foo"; $b2 = "The answer is {$bar['answer']}";
Variante 2 ist zwar IMO schöner, aber ohne Syntax-Highlighting evtl. nicht immer ganz klar ersichtlich. Und bei Arrays oder Hashs doch ziemlich unübersichtlich.
Außerdem verwendet man bei hardcodierten Strings ja eigentlich immer Single-Quotes, und deshalb wär Konformität da ganz nett. Andrerseits verkommt das Ganze sehr leicht zu einem Quote-Dschungel, wenn man fuer jede Variable die Wurst "Quotes zu, KonkatenationsOp, Variable, KonkatenationsOp, Quotes auf" schreiben muss.Anyway: wenn jemand mal Messungen gemacht hat, was schneller ist, oder klare Argumente für die eine oder andere Variante hat dann soll er sich bitte melden. Oder gibts gar ein Allgemeingültiges Idiom, von dem ich nichts weiß?
Ach ja: Bitte beschränkt euch auf Posts mit "Inhalt", mit einem "Also ich machs immer so" ohne fundierte Begründung von jemanden, der grad mal ein paar Monate PHP schreibt hilft niemandem weiter
-
OK, ich schreib' trotzdem mal etwas, auch wenn ich keine direkten Vor-/Nachteile in Deinem Sinne anzubieten habe.
Deine zweite Variante gefällt mir persönlich überhaupt nicht. Ich hab's mir mal im Editor angesehen, aber trotz Syntax-Highlight befindet sich die Variable innerhalb des Strings und wird bei mir nicht als Variable hervorgehoben
=> der gesamte String ist bei mir grau.Bisher habe ich mir angewöhnt Strings Single-Quoted zu schreiben und mit "." zu konkatenieren.
Vor-/Nachteile: [ + ] Variablen sind auf den ersten Blick erkennbar [ + ] Single-Quoted soll schneller sein als Double-Quoted (HörenSagen, noch nicht gemessen) [ - ] Es nervt ein wenig den String immer wieder abzuschliessen und neu beginnen zu müssen [ - ] wahrscheinlich leidet die Performance ein wenig unter der ständigen Konkatenation (Vermutung)
Evtl. ist die sprintf-Variante eine Option, allerdings könnte ich mir da auch vorstellen, dass die Performance darunter leidet, jedoch bietet sich das zumindest bei meinem Coding-Style an.
Beispiel:
// Zur Info: Ich rücke alles per Tab ein // Array z.B. so $var = array( 'key1' => 'value1', 'key2' => 'value2' ); // Wie ich es bisher bei z.B. SQL-Query mache $sql = 'select * from `' . $table . '` ' . 'where `col1` = \'' . $value . '\''; // Mit der sprintf-Variante $sql = sprintf( 'select * from `%s` where `col1` = \'%s\'', $table, $value ); // Bei einem langen Query könnte man den String weiterhin konkatenieren $sql = sprintf( 'select * from `%s` ' . 'where `col1` = \'%s\'', $table, $value );
Wie gesagt habe ich noch keine Messungen mit der sprintf-Variante gemacht, aus irgendeinem Grund gefällt mir diese aber ziemlich gut.
Ich kann mich ja nochmal dazu melden, wenn ich Messungen durchgeführt habe.
-
mantiz schrieb:
Vor-/Nachteile: ... [ + ] Single-Quoted soll schneller sein als Double-Quoted (HörenSagen, noch nicht gemessen) ...
Thx fuer die Antwort. Single-Quoted Strings sind ja genau deswegen schneller, weil der Interpreter nicht den String nach evtl. zu ersetzenden Variablen anzeigen muss. Wahrscheinlich schenken sie sich also genau in so einem Beispiel sehr wenig. Single-Quoted muss halt Konkatenieren, Double-Quoted den ganzen String durchschauen. Aber du hast Recht, evtl. sollte man das echt mal messen
-
Wirklich unwichtig! Die Probleme (Hotspots) sind eher bei Rekursion, "falschen"(langsamen) Algorithmen zu finden.
-
Wie oft eigentlich noch
http://www.c-plusplus.net/forum/viewtopic-var-t-is-156219.html
-
Ja, ich weiß, dass Du diese Meinung vertrittst und diese evtl. auch untermauern kannst. Ich muss gestehen, dass ich mir die beiden im verlinkten Thread genannten Dateien kurz angesehen habe und nicht wirklich durchblicke, weswegen ich Deiner Argumentation nicht ganz folgen kann, aber:
Wenn der Parser aus:
$var2 = "text $var text"; // (1)
dieses macht:
$var2 = 'text' . $var . 'text'; // (2)
Dann müsste (1) per Definition langsamer sein, als wenn man sofort (2) verwendet, da der Parser in dem Fall, dass man sofort (2) verwendet gar nichts ersetzen muss.
Auch, wenn diese Ersetzung mit einem Regex-Aufruf stattfindet und dieser Regex-Aufruf in jedem Fall stattfindet, ob man nun (1) verwendet oder nicht, dann müsste dieser Aufruf dennoch schneller sein, wenn nichts gematcht wird, als wenn z.B. 1000 Matches da sind, da diese 1000 Matches doch dann ersetzt werden müssen. Und wenn pro Match für die Ersetzung nur 100 ns oder evtl. weniger benötigt wird, dann sind es bei 1000 Matches bereits 10 ms (evtl. weniger).
Dann kommt es doch nur darauf an, ob es sich lohnt oder nicht, wieviele Strings man in dieser Form verwendet.
So falsch kann ich damit doch nicht liegen, oder?
PS: Bin für Erklärungen (Korrekturen) immer offen.
-
Im ersten Fall hast du zwei Operationen: Variablen-Ersetzung und Zuweisung.
Im zweiten Fall hast du drei Operationen: String-Konkatenation, wieder eine String-Konkatenation und dann die ZuweisungDas mit dem Regex hast du falsch verstanden. Mit einem Regex wird nur die Variable erkannt, was innerhalb und außerhalb eines Strings fast gleich abläuft. Mit dem Ersetzen selbst hat das nichts zu tun