22 Stimmen

Wie lassen sich zwei Zeichenketten am besten zusammenfügen?

Ich habe irgendwo gelesen (ich glaube, bei codinghorror), dass es eine schlechte Praxis ist, Zeichenketten so zu addieren, als wären sie Zahlen, da Zeichenketten, genau wie Zahlen, nicht geändert werden können. Wenn man sie also zusammenfügt, entsteht eine neue Zeichenkette. Also, ich frage mich, was ist der beste Weg, um zwei Zeichenfolgen zusammen zu addieren, wenn man sich auf die Leistung?

Welche dieser vier Möglichkeiten ist besser, oder gibt es eine andere, die besser ist?

//Note that normally at least one of these two strings is variable
$str1 = 'Hello ';
$str2 = 'World!'; 
$output1 = $str1.$str2; //This is said to be bad

$str1 = 'Hello ';
$output2 = $str1.'World!'; //Also bad

$str1 = 'Hello';
$str2 = 'World!';
$output3 = sprintf('%s %s', $str1, $str2); //Good?
//This last one is probaply more common as:
//$output = sprintf('%s %s', 'Hello', 'World!');

$str1 = 'Hello ';
$str2 = '{a}World!';
$output4 = str_replace('{a}', $str1, $str2);

Ist das überhaupt wichtig?

38voto

Patrick Glandien Punkte 7601

Die String-Konkatenation mit einem Punkt ist definitiv die schnellste der drei Methoden. Es wird immer eine neue Zeichenkette erzeugt, ob Sie das wollen oder nicht. Der schnellste Weg wäre wahrscheinlich:

$str1 = "Hello";
$str1 .= " World";

Setzen Sie sie nicht in doppelte Anführungszeichen wie $result = "$str1$str2"; da dies zusätzlichen Overhead für das Parsen von Symbolen innerhalb der Zeichenkette erzeugt.

Wenn Sie dies nur für die Ausgabe mit echo verwenden wollen, dann nutzen Sie die Eigenschaft von echo, dass Sie ihm mehrere Parameter übergeben können, da dies keine neue Zeichenkette erzeugt:

$str1 = "Hello";
$str2 = " World";
echo $str1, $str2;

Für weitere Informationen darüber, wie PHP interpolierte Strings und String-Verkettung behandelt Besuchen Sie Sarah Golemans Blog .

12voto

Ed S. Punkte 118985

Sie werden immer eine neue Zeichenkette erstellen, wenn Sie zwei oder mehr Zeichenketten miteinander verknüpfen. Dies ist nicht unbedingt "schlecht", aber es kann in bestimmten Szenarien (wie Tausende/Millionen von Verkettungen in einer engen Schleife) zu Leistungseinbußen führen. Da ich kein PHP-Experte bin, kann ich Ihnen keine Ratschläge zur Semantik der verschiedenen Arten der String-Verkettung geben, aber für eine einzelne String-Verkettung (oder nur wenige) sollten Sie sie einfach lesbar machen. Eine geringe Anzahl von Stringverkettungen führt nicht zu einem Leistungseinbruch.

12voto

Aleksandr Makov Punkte 2692

Hier ist der schnelle und schmutzige Testcode, um die Leistungsengpässe zu verstehen.

Einfacher Zusammenschluss:

$iterations = 1000000;
$table = 'FOO';
$time = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
        $sql = sprintf('DELETE FROM `%s` WHERE `ID` = ?', $table);
}
echo 'single sprintf,',(microtime(true) - $time)."\n";

$time = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
        $sql = 'DELETE FROM `' . $table . '` WHERE `ID` = ?';
}
echo 'single concat,',(microtime(true) - $time)."\n";

$time = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
        $sql = "DELETE FROM `$table` WHERE `ID` = ?";
}
echo 'single "$str",',(microtime(true) - $time)."\n";

Ich erhalte diese Ergebnisse:

single sprintf,0.66322994232178
single concat,0.18625092506409 <-- winner
single "$str",0.19963216781616

Viele Konkaten (10):

$iterations = 1000000;
$table = 'FOO';
$time = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
        $sql = sprintf('DELETE FROM `%s`,`%s`,`%s`,`%s`,`%s`,`%s`,`%s`,`%s`,`%s`,`%s` WHERE `ID` = ?', $table, $table, $table, $table, $table, $table, $table, $table, $table, $table);
}
echo 'many sprintf,',(microtime(true) - $time)."\n";

$time = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
        $sql = 'DELETE FROM `' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '`,`' . $table . '` WHERE `ID` = ?';
}
echo 'many concat,',(microtime(true) - $time)."\n";

$time = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
        $sql = "DELETE FROM `$table`,`$table`,`$table`,`$table`,`$table`,`$table`,`$table`,`$table`,`$table`,`$table` WHERE `ID` = ?";
}
echo 'many "$str",',(microtime(true) - $time)."\n";

Ergebnisse:

many sprintf,2.0778489112854
many concats,1.535336971283
many "$str",1.0247709751129 <-- winner

Als Schlussfolgerung wird deutlich, dass eine einzelne Verknüpfung mittels Punkt (.) Zeichen die schnellste ist. Und für Fälle, in denen Sie viele Konkaten haben, ist die beste Methode die direkte String-Injektion über "injection: $inject" Syntax.

5voto

Toby Allen Punkte 10652

Solange es sich nicht um eine wirklich große Textmenge handelt, spielt es keine Rolle.

3voto

PhiLho Punkte 39496

Wie die anderen schon sagten, $str1 . $str2 ist in den meisten Fällen völlig in Ordnung, außer in (großen) Schleifen.
Beachten Sie, dass Sie einige Lösungen übersehen:

$output = "$str1$str2";

und bei einer großen Anzahl von Zeichenketten können Sie diese in ein Array packen und implode() verwenden, um eine Zeichenkette daraus zu machen.

Oh, und "Zeichenketten hinzufügen" klingt schlecht, oder zumindest zweideutig. In den meisten Sprachen sprechen wir lieber von String-Verkettung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X