Die String-Verkettung Vs String-Generator Anhängen
Also...ich habe dieses Szenario, wo ich eine Foreach-Schleife durchläuft eine Liste von Checkboxen zu überprüfen, welche ausgewählt sind. Für jede checkbox ausgewählt, ich habe zu tun, einen ziemlich langen string-Verkettung, mit 30 verschiedenen Zeichenfolgen, die eine Durchschnittliche Länge von 20 Zeichen und senden Sie es dann als HTTP-request. 2 des strings abhängig von der index-Wert der checkbox ausgewählt werden.
Die Länge der Liste von Checkboxen ist auch variabel je nach den Daten des Benutzers. Ich würde sagen, die Durchschnittliche Länge der Liste wäre 20, aber es gehen kann, bis zu 50-60. So ist die worst-case-Szenario wäre die Durchführung der gesamten string-Verkettung 60 oder so mal.
Für jetzt mache ich es mit einfachen Verkettung von Strings mit dem ' + ' - operator, aber ich Frage mich, ob es wäre schneller, es zu tun mit Stringbuilder. Natürlich, das bedeutet, dass ich entweder erstellen Sie ein Stringbuilder-Objekt innerhalb der Schleife, oder erstellen Sie es, bevor die Schleife und nennen die Klasse Stringbuilder.Entfernen Sie am Ende der es, nach versenden der HTTP-Anforderung.
Ich freue mich über jede Einblicke niemandem teilen kann in Bezug auf dieses Problem.
BEARBEITEN
Vielen Dank für all die Antworten alle zusammen, also von dem, was ich gesammelt habe, die beste Möglichkeit für mich zu tun, dies wäre so etwas wie:
StringBuilder sb = new StringBuilder();
foreach (CheckBox item in FriendCheckboxList)
{
if (item.Checked)
{
sb.Append(string1);
sb.Append(string2);
sb.Append(string3);
.
.
.
sb.Append(stringLast);
SendRequest(sb.ToString());
sb.Length = 0;
}
}
Nein. Wenn für die Length-Eigenschaft auf null, löscht es.
someStringBuilder.length = 0;
Sie könnten check out <ein href="stackoverflow.com/questions/1612797/...> SO ein post auf die Verkettung vs Stringbuilder perforamnce.
Ich habe deine Frage oben, aber ich wollte auch darauf hinweisen, dass Ihr Bearbeiten, ist irreführend. Sie verwendeten die phrase "der beste Weg", das ist A) subjektiv und B) nicht korrekt. In Bezug auf A) Bessere Formulierung wäre "die allgemein vereinbarte Weise". Bezüglich B) "besser" in diesem Fall ist die Verwendung von String.Concat statt StringBuilder, wie in meinem vorgeschlagenen Antwort. Nichts falsch mit der Antwort, StringBuilder ist in Ordnung. Nur vorsichtig sein, etwas zu behaupten, als "die besten" da oft etwas wurde oder entdeckt werden, was eigentlich besser ist.
InformationsquelleAutor Kronon | 2009-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
StringBuilder
. Das ist, was es ist.Strings sind unveränderlich. Die String-Verkettung erstellt eine neue Zeichenfolge, benötigen mehr Speicher, und ist allgemein als langsam:
Dieser erstellt eine Zeichenfolge "John ", dann wird ein zweiter string "John Saunders", dann weist das auf "ein". Der "John" ist Links für garbage collection.
Dies ist etwa die gleiche, als "John" wird ersetzt durch eine neue Zeichenfolge "John ", die ersetzt wird durch eine neue Zeichenfolge "John Saunders". Die Originale befinden sich Links von der garbage Collection freigegeben.
Auf der anderen Seite
StringBuilder
ist entworfen, um angehängt werden, entfernt, etc.Beispiel:
Ich entschuldige mich, wenn meine Frage schien frivol, aber ich wollte Fragen, ob die Schaffung eines neuen Stringbuilder-Objekt bei jeder Schleife würde dazu führen, dass unnötige overhead.
Warum würden Sie wollen, um eine neue zu erstellen?
Ich würde davon ausgehen, dass bedeutet, dass Sie die Empfehlung ruft die Klasse Stringbuilder.Entfernen Sie am Ende jeder Schleife dann?
Hat Ihr erste Beispiel eigentlich 2 Saiten? Ich denke eher, dass der compiler Optimierung, die zu einer einzigen Zeichenfolge ist und dass keine Verkettung auftreten.
InformationsquelleAutor John Saunders
Diesem Thema wurde analysiert, um den Tod über die Jahre. Das Endergebnis ist, dass, wenn Sie tun, eine kleine, bekannte Anzahl von Verkettungen, verwenden Sie ' + ' verwenden, ansonsten stringbuilder. Von dem, was Sie gesagt haben, verketten Sie die mit '+' sollte schneller sein. Es gibt eine Unmenge von (geben oder nehmen) - sites gibt, die Analyse dieses - google es.
Für die Größe der Zeichenfolge, die Sie reden, es ist sowieso vernachlässigbar.
EDIT: on second thought, SB ist wahrscheinlich schneller. Aber wie gesagt, who cares?
habe Sie in der als ich Bearbeiten 🙂 ich denke, dass SB könnte NUR schneller sein, aber denken Sie daran, dass alle das 'verwerfen' von strings erfolgt durch den GC, die hat einen ziemlich effizienten job gemacht, und nicht wirklich behandelt, indem die aktuellen Ausführungspfad.
seine immer noch unnötige GC-Arbeit, könnte leicht vermieden werden...es ist nicht wie reden wir über 2 oder 3 Saiten...
Es gibt auch die Zuteilung kommt vor dem verwerfen... ich habe gesehen, wie diese Verkettungen verursachen sichtbare performance-Verlust.
Als ich, vor Jahren, bevor wir die verwendeten Bibliotheken zu tun alle unsere XML-lovin 🙂 Noch immer, während ich kann mich nicht erinnern aus der Spitze von meinem Kopf, gibt Es Graphen gibt, die zeigen, dass diese Größe der operation sollte nicht wirklich ein problem sein. SB kann einige abgefahrene Dinge, aber - ich sehe, John, dass Sie aktualisiert haben Ihren Beitrag. Ich würde auf jeden Fall gehen Sie mit Ihrer letzten Probe. Noch, nicht wirklich ein Problem.
InformationsquelleAutor Luke Schafer
Ich weiß, das beantwortet wurde, aber ich wollte darauf hinweisen, dass eigentlich denke ich, die "blind akzeptiert als Evangelium" - Ansatz, der immer mit StringBuilder ist manchmal falsch, und dies ist ein Fall.
Hintergrund finden Sie in diesem blog-Eintrag: http://geekswithblogs.net/johnsperfblog/archive/2005/05/27/40777.aspx
Hinter der es ist, für diesen speziellen Fall, wie beschrieben ist, wird eine bessere performance durch die Vermeidung von StringBuilder und die Nutzung der " + " - operator wie folgt:
Der Grund dafür ist, dass der C# - compiler (ab .NET 1.1), konvertiert die Anweisung in eine einzelne IL Aufruf von String.Concat übergeben ein array von Strings als argument. Der blog-Eintrag hat eine ausgezeichnete Arbeit skizziert die details der Implementierung von String.Concat, aber es genügt zu sagen, es ist extrem effizient, für diesen Fall.
Wenn es eine Feste Anzahl von strings zu verketten, Zeichenkette.Concat ist besser, bei weitem. Alle muss tun ist, fügen Sie die Summe der string-Längen, Speicher, kopieren Sie jede Zeichenfolge, und Sie sind fertig. Wenn Sie dann erwarten, mehr zu tun, der Verarbeitung, der Typ ist wahrscheinlich besser.
InformationsquelleAutor hemp
Wenn Ihr diese Frage zu stellen, sind die Chancen sollten Sie nutzen StringBuilder für viele Gründe, aber werde ich zwei.
Wenn Sie die Verwendung von string-Verkettung es zuordnen muss neuer Puffer und kopiert die Daten in den anderen string in das neue string-variable. Also du gehst zu entstehen viele wiederholte Zuweisungen. Was am Ende landet die Fragmentierung des Speichers, die Verwendung von bis heap-Speicher, und damit mehr Arbeit für den Garbage collector.
Das StringBuilder-Objekt auf der anderen Seite vor-reserviert einen Puffer und wenn du neue Saiten braucht er nicht zu halten, neu zuweisen (vorausgesetzt, erste Puffer ist groß genug). Die Leistung erhöht und ist weit weniger anstrengend für den Arbeitsspeicher.
Als Entwickler sollten wir versuchen, die Zukunft zu antizipieren Wachstum. Lassen Sie uns sagen, dass Ihre Liste wächst deutlich über die Zeit und dann plötzlich fängt langsam arbeitet. Wenn Sie können verhindern, dass diese mit wenig Aufwand jetzt, warum sollten Sie es nicht?
InformationsquelleAutor James
Im Allgemeinen würde ich empfehlen, mit einer
StringBuilder
.Haben Sie diese getestet und überprüft die Leistung? Ist die performance ein Problem, vs, wie lange es dauern wird, Sie den code neu schreiben?
InformationsquelleAutor Adriaan Stander