Was ist der Unterschied zwischen Kapazität und maxCapacity im StringBuilder-Konstruktor?

8

Es gibt einen -Konstruktor in der Klasse StringBuilder (int32, int32). Sie sehen, dass zwei Parameter vorhanden sind: Kapazität und maxCapacity .

Ich habe versucht, den Unterschied zwischen Kapazität und maxCapacity in StringBuilder-Konstruktor zu suchen. Aber ich habe nichts verstanden, um diesen Konstruktor zu verstehen. Ich habe Dokumentation zu msdn gefunden. Dennoch verstehe ich nicht, warum es erforderlich ist und wie diese Parameter verwendet werden. Irgendeine Frage in meinem Kopf, wo sollte ich diesen Konstruktor verwenden? Und hilft es, die Leistung meiner Anwendung zu verbessern?

    
Shell 01.03.2014, 06:20
quelle

5 Antworten

4

Vom MSDN: StringBuilder(int,int)

  

Initialisiert eine neue Instanz der StringBuilder-Klasse, die mit beginnt   eine angegebene Kapazität und kann bis zu einem bestimmten Maximum anwachsen.

Also ist die Capcity die Größe, mit der sie gestartet / erstellt werden muss und MaxCapacity ist die Begrenzung der Stringbuilder .

Beispiel 1: Probieren Sie das folgende Beispiel nacheinander aus

%Vor%

Beispiel 2: Versuchen Sie das folgende Beispiel auf einmal

%Vor%

BEARBEITEN:

Ja MaxCapacity wird selten verwendet.

StringBuilder (int Capacity) : Mit Capacity -Parameter wird das StringBuilder -Objekt im Speicher erstellt.

Sobald der Benutzer Objekte hinzufügt und die Größe das Kapazitätslimit überschreitet, weist er mehr Speicher zu, um die überzähligen Zeichen aufzunehmen, und wächst weiter, bis kein Problem mit dem Speicher auftritt.

StringBuilder (int Capacity, int maxCapacity) : Er macht dasselbe wie oben bei einem Constructor-Parameter, aber bevor er seinen Runtime-Speicher zur Berücksichtigung von überschrittenen Zeichen erstellt / erhöht, sucht er nach MAXCAPACITY limit überschreitet das MAXCAPACITY -Grenze und wirft dann Exception .

Von den folgenden Comments: Wie @Sriram sagte MaxCapacity -Parameter hat nichts mit Speicherzuweisung zu tun.

    
Sudhakar Tillapudi 01.03.2014, 06:35
quelle
3

Unterschied zwischen

Für Kapazität

Wenn die Anzahl der Zeichen, die in der aktuellen Instanz gespeichert werden sollen, diesen Kapazitätswert überschreitet, weist das Objekt StringBuilder zusätzlichen Speicher zu , um sie zu speichern.

String Builder-Klasse bietet jedoch eine effiziente Möglichkeit um String-Strings wiederholt an bereits konstruierte Objekte anzufügen.

StringBuilder ist nützlich, wenn wir eine große Zeichenfolge erstellen möchten

Kapazität steht für den zusammenhängenden Speicher, der dem StringBuilder zugewiesen wurde. Kapazität kann & gt; = Länge der Zeichenfolge sein. Wenn mehr Daten an den StringBuilder als an die Kapazität angehängt werden, erhöht StringBuilder die Kapazität automatisch. Da die Kapazität überschritten wurde (dh zusammenhängender Speicher ist voll und kein Pufferspeicher mehr verfügbar), wird ein größerer Pufferbereich zugewiesen, und Daten werden vom ursprünglichen Speicher in diesen neuen Bereich kopiert.

Es werden keine Daten in eine neue 'Instanz' kopiert, sondern in einen neuen 'Speicherort'. Die Instanz bleibt gleich, zeigt aber auf den neuen Speicherort.

Die Standardkapazität von StringBuilder ist bei der Erstellung nicht 16

Für maxCapacity

Wenn die Anzahl der in der aktuellen Instanz zu speichernden Zeichen diesen maxCapacity-Wert überschreitet, weist das Objekt StringBuilder keinen zusätzlichen Speicher zu , sondern löst stattdessen eine Ausnahme aus

Die maximale Kapazität für diese Implementierung ist Int32.MaxValue. Dieser Wert ist jedoch implementierungsspezifisch und kann in anderen oder späteren Implementierungen anders sein.

MSDN maxCapacity

    
Ganesh_Devlekar 01.03.2014 06:31
quelle
2

Es ist wichtig zu verstehen, dass Objekte wie ein StringBuilder internen Speicher für ihre Daten bereitstellen müssen. Das wird im Allgemeinen ein Array sein. Normalerweise ist die Größe dieses Arrays ziemlich klein. Wenn Sie dem Objekt Daten hinzufügen, muss jedes Mal, wenn die Daten über die Grenzen dieses Arrays hinaus wachsen, mehr Speicherplatz zugewiesen werden. Wenn Sie ein initiales capacity angeben, wird das interne Array zunächst mit dieser Größe erstellt. Das bedeutet, dass die Größe des Arrays weniger geändert werden muss, wenn Daten hinzugefügt werden. Wenn Sie wissen, dass Sie dem StringBuilder mindestens N Zeichen hinzufügen, ist es sinnvoll, N als initiales capacity anzugeben, um unnötige Größenänderungen zu vermeiden. maxCapacity ist die größte Größe, auf die das interne Array erhöht werden kann.

    
jmcilhinney 01.03.2014 06:33
quelle
2

Nachdem ich alle Antworten gelesen habe, verstehe ich schließlich den Unterschied zwischen Kapazität und maxCapacity. Jetzt versuche ich ein Beispiel, um die Zeit des Prozesses in verschiedenen Szenarien zu bestimmen. Also, ich werde etwas über StringBuilder Constructor teilen. Ich habe StringBuilder.Append Methode in folgenden Fällen getestet und ich habe einige Ergebnisse.

Der Anwendungscode ist einfach

%Vor%

In der Deklaration von StringBuilder habe ich folgende Konstruktoren verwendet.

ie. StringBuilder str = new StringBuilder(3, 5)

%Vor%

Die Ergebnisse sind wie folgt

%Vor%

Wenn ich ein Objekt von StringBuilder mit maxCapacity erzeuge, dauert es länger, Text anzuhängen als in zwei anderen Fällen. Aber es gibt keinen Unterschied zwischen der Deklaration eines Objekts mit Kapazität und ohne Kapazität. Ich denke, dass es einige Zeit in Anspruch nimmt, die maximale Kapazität des definierten String-Builder-Klassenobjekts zu überprüfen.

    
Shell 01.03.2014 08:28
quelle
1
  • Kapazität ist für die Startkapazität des StringBuilders. Kapazität ist der aktuelle Speicher, der vom StringBuilder zugewiesen wird. Wenn Sie Text hinzufügen, muss die Menge des zugewiesenen Speichers erhöht werden, wenn die aktuelle Kapazität überschritten wird. Das braucht etwas Zeit. Um die Größe des Speichers des StringBuilders nicht zu ändern, können Sie ihn auf einen höheren Wert setzen und dadurch die Leistung Ihrer Anwendung erhöhen. Wenn Sie wissen, wie lange die Zeichenfolgen, die Sie erstellen möchten, mit einer hohen Wahrscheinlichkeit maximal sind, ist dies ein guter Ausgangspunkt, da Sie die Anzahl der Speicherumverteilungen reduzieren.
  • maxCapacity markiert die maximale Kapazität des StringBuilders und ermöglicht es, die vom StringBuilder genutzte Speichermenge zu begrenzen. Wenn Sie Daten hinzufügen, wird der Speicher nicht über diese Grenze hinaus erhöht, sondern es wird eine Ausnahme ausgelöst. So können Sie verhindern, dass Speicherprobleme auftreten, wenn Ihre Anwendung dem StringBuilder zu viel hinzufügen möchte. Beachten Sie jedoch, dass dieses Limit unter bestimmten Umständen nicht von .NET 4 eingehalten wird (siehe link ).

Wenn Sie also diesen Konstruktor verwenden, können Sie sowohl Ihre Leistung steigern als auch ein Limit setzen. Aus meiner Erfahrung habe ich meistens den Konstruktor benutzt, der erlaubt, die Anfangskapazität einzustellen und selten eine maxCapacity gesetzt zu haben. Aber Sie könnten diesen Konstruktor verwenden, wenn Sie Daten aus unbekannten Quellen an einen StringBuilder anhängen, z. aus einer Datei, die von Benutzern bereitgestellt wird, um früher und eleganter reagieren zu können, als die Verarbeitung einer OutOfMemoryException ermöglicht. Die Verwendung dieses Konstruktors erhöht also auch die Robustheit Ihrer Anwendung.

    
Markus 01.03.2014 06:34
quelle

Tags und Links