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?

3voto

ya23 Punkte 13912

Es spielt keine Rolle, es sei denn, es wird in einer langen Schleife verwendet. In den meisten Fällen sollte man sich auf die Lesbarkeit des Codes konzentrieren, auch wenn man einige Prozessorzyklen verliert.

Beispiel 1 und 2 ähnlich sind, denke ich nicht, dass es einen großen Unterschied geben sollte, das wäre der schnellste von allen. Nr. 1 könnte etwas schneller sein.

Beispiel 3 wird langsamer sein, da das sprintf-Format ('%s %s') geparst werden muss.

Beispiel 4 führt die Ersetzung durch, bei der eine Zeichenkette durchsucht werden muss - ein zusätzlicher Aufwand, der mehr Zeit in Anspruch nimmt.

Aber erstens: Ist die Verkettung von Zeichenketten ein Leistungsproblem? Das ist sehr unwahrscheinlich. Sie sollten ein Profil des Codes erstellen, um zu messen, wie viel Zeit für die Ausführung benötigt wird. Ersetzen Sie dann die Verkettungsmethode durch eine andere und messen Sie erneut.

Wenn Sie es als ein Problem identifizieren, versuchen Sie googeln für php string builder Klasse (es gibt einige zu finden) oder schreiben Sie Ihre eigenen.

2voto

Dave Houlbrooke Punkte 130

Ich habe diesen Beitrag bei Google gefunden und dachte, ich führe mal ein paar Benchmarks durch, weil ich neugierig auf das Ergebnis war. (Benchmarking über 10.000 Iterationen mit einem Benchmarker, der seinen eigenen Overhead subtrahiert).

    Which                        2 strings   10 strings   50 strings
    ----------------------------------------------------------------
    $a\[\] then implode()         2728.20 ps      6.02 s     22.73 s
    $a . $a . $a                 496.44 ps      1.48 s      7.00 s
    $b .= $a                     421.40 ps     1.26 s      5.56 s
    ob\_start() and echo $a      2278.16 ps      3.08 s      8.07 s
    "$a$a$a"                     482.87 ps      1.21 s     4.94 s 
    sprintf()                   1543.26 ps      3.21 s     12.08 s

Es ist also nicht viel drin. Wahrscheinlich gut zu vermeiden sprintf() y implode() wenn es schnell gehen soll, aber es gibt keinen großen Unterschied zwischen den üblichen Methoden.

0voto

DisgruntledGoat Punkte 66021

Die Ratschläge, die Sie gelesen haben, beziehen sich möglicherweise auf die echo Funktion, für die es schneller ist, Kommas zu verwenden, z. B.:

echo $str1, $str2;

Eine andere Möglichkeit besteht darin, eine Zeichenkette in einer Variablen zu erstellen (z. B. mit dem Operator .) und dann die gesamte Zeichenkette am Ende auszugeben.

Sie können dies selbst testen, indem Sie die Funktion microtime verwenden (Sie müssen eine Schleife erstellen, die z. B. 1.000 oder 100.000 Mal wiederholt wird, damit die Zahlen aussagekräftig sind). Aber von den vier, die Sie gepostet haben, ist die erste wahrscheinlich die schnellste. Sie ist auch am lesbarsten - die anderen sind programmtechnisch nicht wirklich sinnvoll.

0voto

Thinker Punkte 13632

Dies ist keine Lösung für 2 Saiten, aber wenn Sie daran denken, mehrere Saiten zu verbinden, ist dies der beste Weg:

$tmp=srray();
for(;;) $tmp[]='some string';
$str=implode('',$tmp);

Es ist schneller, Array-Elemente zu erstellen und sie alle auf einmal zu verbinden, als sie hundertmal zu verbinden.

0voto

shad Punkte 1710

Ich bin kein PHP-Guru, aber in vielen anderen Sprachen (z. B. Python) ist der schnellste Weg, eine lange Zeichenkette aus vielen kleineren Zeichenketten zu erstellen, die Zeichenketten, die Sie verketten wollen, an eine Liste anzuhängen und sie dann mit einer eingebauten Join-Methode zu verbinden. Zum Beispiel:

$result = array();
array_push("Hello,");
array_push("my");
array_push("name");
array_push("is");
array_push("John");
array_push("Doe.");
$my_string = join(" ", $result);

Wenn Sie eine große Zeichenkette in einer engen Schleife aufbauen, ist der schnellste Weg, dies zu tun, indem Sie an das Array anhängen und dann das Array am Ende verbinden.

Hinweis: Diese ganze Diskussion hängt von der Leistung eines array_push ab. Sie müssen Ihre Zeichenketten an ein Liste damit dies bei sehr großen Zeichenketten wirksam ist. Aufgrund meiner begrenzten Exposition gegenüber php, ich bin nicht sicher, ob eine solche Struktur verfügbar ist oder ob php's Array ist schnell auf neue Elemente anhängen.

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