Frage

Was ist die Standard-Kapazität eines StringBuilder?

Und wann sollte (oder sollte nicht) die Standardeinstellung verwendet werden?

War es hilfreich?

Lösung

Der ehrwürdige J. Skeet hat eine gute Analyse der genau dieses Problem zu finden:

https://jonskeet.uk/csharp/stringbuilder.html

Andere Tipps

Die Standardkapazität von String beträgt 16 Zeichen (I verwendet .NET Reflector zu erfahren).

Der Standardwert ist 16, der die Standard-Kapazität von jeder Art von Array oder einer Liste in dem .NET-Framework zu sein scheint. Die geringere Anzahl von Umschichtungen auf dem String benötigen, desto besser ist es. Inzwischen ist es unnötig, viel mehr zu vergeben als benötigt wird, zu.

I instanziiert in der Regel den String mit irgendeiner Art von grober Schätzung in Bezug auf die endgültige Größe des String. Zum Beispiel könnte dies auf einigen Iterationszahlcode basieren, die Sie später verwenden werden die Zeichenfolge, mal die Größe für jedes Element in dieser Iteration benötigt zu bauen.

// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}

Wenn die Größe eines String zu klein ist, um die nächste Zeichenfolge für das Schreiben, der interne char Array von String auf das Doppelte der aktuellen Größe neu zugewiesen wird.

Diese Frage kam heute als Duplikat einer anderen, aber ich bemerke ein Teil beantwortet wurde nicht. Der Standard (vorausgesetzt, das bedeutet „, wenn sie nicht mit einer Zeichenfolge erstellt, die groß genug ist, zu verlangen) ist 16, wie die Leute sagten, aber ich sehe hier nichts, wenn Sie sollen es ändern.

Sie es ändern, wenn Sie, um eine mögliche Optimierung tun können. Tatsächlich ist die Wahl der 16 das Gegenteil zu einer Optimierung. Optimierung ist Kommissionierung Wert und Ansätze, um besonders gut einen bestimmten Fall oder Teilmenge von möglichen Fällen zu passen, (im Allgemeinen nicht „Dinge schneller zu machen“, obwohl das ist, wie wir oft das Wort verwenden). Hier ist der Designer der Klasse zu tun hatte mit Verallgemeinerung -. Kommissionierung Wert und Ansätzen, um einigermaßen gute Leistung in einem breiten Spektrum von Fällen zu geben

Je kleiner sie gingen, desto weniger Speichernutzung.

Je größer sie gingen, desto weniger Umverteilung mit größeren Strings zu behandeln.

Es gibt ein paar Gründe, warum binary-Runde (ganze Zweierpotenzen) wahrscheinlich eine bessere Leistung als andere Zahlen in bestimmten Fällen geben, damit sie gingen für eine von denen, aber abgesehen davon die Wahl zwischen 4 oder 16 oder 1024 war eine Frage der unterschiedlichen wahrscheinlich Werte ausgleicht.

Jemand mit StringBuilder anstatt es zu entwerfen, kann eine bessere Vorstellung davon haben, welche Größe sie wahrscheinlich brauchen.

Wenn sie gehen, um Append 5 1-stellige Zahlen zusammen mit Strings, die zu 43 Zeichen lang insgesamt, so ist die Gesamtlänge der StringBuilder wird 48 Zeichen sein, egal was, so sollten sie eine Kapazität von 48 verwenden als 48 ist immer die effizienteste Größe für eine Reihe von 48 Länge.

Wenn sie etwas tun, wo es eine Länge zwischen etwa 23 und 34 Zeichen sein könnte, sollten sie 34 verwendet werden.

Wenn sie etwas tun, wo es wird wahrscheinlich nie mehr als 60 Zeichen sein, aber ab und zu könnte es sein, sollten sie 64 verwenden (keine Neuverteilung der nicht für die meisten Teile, und gewinnen die Potenz von zwei Nutzen oben erwähnt für die wenigen Fälle, in denen Sie tun).

Wenn es unmöglich, eine Schlussfolgerung zu diesem kommen, oder zumindest schwer so und nicht eine Leistung Hot-Spot zu tun, dann sollten Sie nur verwenden Sie die Standardeinstellung.

Wir können die Kapazität mit der Kapazität Eigenschaft der StringBuilder Klasse finden:

StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

Hier Kapazität definiert die Standardkapazität von StringBuilder.

StringBuilder ist Max Capacity ist gleich der Maximalwert von Int32.

[edit: zu der Zeit, fragte die Frage nach StringList]

Sie meinen StringCollection? Dies verwendet eine leere ArrayList zunächst, so lautet die Antwort 0. Und Sie haben keine Möglichkeit, es zu ändern. Wenn Sie zum ersten Mal ein Element hinzu, die Kapazität auf 4 springt, verwendet dann eine Verdoppelung Strategie, wenn es füllt.

Wenn Sie List<string> bedeuten, dann ist es ähnlich (ein leeres T[], kein ArrayList), aber Sie können eine bekannte Größe initialisieren, wenn Sie benötigen (das heißt Sie wissen, wie viele Daten Sie erwarten). Auch hier verdoppelt sich das erste Mal auf eine Add List<T> die Größe auf 4 springt, dann jedes Mal, es füllt.

Standardkapazität eines String-Builder ist 16 Zeichen , Und Max Kapazität von String-Builder ist 2147483647 Zeichen .

So keine Notwendigkeit für die Speicherung lange Antwort kümmern !!!

Lesen Sie hören über String Kapazität gibt es Probe App es auch zu beweisen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top