Freigeben über


Verwenden von Visual C# zur Verbesserung der Zeichenfolgenverkettungsleistung

Dieser Artikel enthält Informationen zur Verbesserung der Zeichenfolgenverkettungsleistung in Visual C#.

Originalproduktversion: Visual C#
Ursprüngliche KB-Nummer: 306822

Zusammenfassung

In diesem Artikel werden die Vorteile der Verwendung der StringBuilder Klasse gegenüber herkömmlichen Verkettungstechniken erläutert. Zeichenfolgen im Microsoft .NET Framework sind unveränderlich (d. h. der referenzierte Text ist nach der anfänglichen Zuordnung schreibgeschützt). Es bietet viele Leistungsvorteile und stellt dem Entwickler, der sich an C/C++-Zeichenfolgenmanipulationstechniken gewöhnt hat, einige Herausforderungen dar.

Dieser Artikel bezieht sich auf den .NET Framework-Klassenbibliotheksnamespace System.Text.

Beschreibung von Zeichenfolgen im .NET Framework

Eine Technik zur Verbesserung der Zeichenfolgenverkettung strcat() in Visual C/C++ besteht darin, ein großes Zeichenarray als Puffer zuzuweisen und Zeichenfolgendaten in den Puffer zu kopieren. In .NET Framework ist eine Zeichenfolge unveränderlich, sie kann nicht geändert werden. Der C# + -Verkettungsoperator erstellt eine neue Zeichenfolge und verursacht eine reduzierte Leistung, wenn große Textmengen verkettet werden.

Das .NET Framework enthält jedoch eine StringBuilder Klasse, die für die Zeichenfolgenverkettung optimiert ist. Es bietet dieselben Vorteile wie die Verwendung eines Zeichenarrays in C/C++, und das automatische Vergrößern der Puffergröße (falls erforderlich) und das Nachverfolgen der Länge für Sie. Die Beispielanwendung in diesem Artikel veranschaulicht die Verwendung der StringBuilder Klasse und vergleicht die Leistung mit Verkettung.

Erstellen und Ausführen einer Demoanwendung

  1. Starten Sie Visual Studio, und erstellen Sie dann eine neue Visual C#-Konsolenanwendung.

  2. Im folgenden Code werden die += Verkettungsoperatoren und die StringBuilder Klasse verwendet, um jeweils 5.000 Verkettungen von 30 Zeichen zu verwenden. Fügen Sie diesen Code zur Hauptprozedur hinzu.

    const int sLen = 30, Loops = 5000;
    int i;
    string sSource = new String('X', sLen);
    string sDest = "";
    
    // Time string concatenation.
    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
    for (i = 0; i < Loops; i++) sDest += sSource;
    stopwatch.Stop();
    Console.WriteLine($"Concatenation took {stopwatch.ElapsedMilliseconds} ms.");
    
    // Time StringBuilder.
    stopwatch.Restart();
    System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1));
    for (i = 0; i < Loops; i++) 
        sb.Append(sSource);
    sDest = sb.ToString();
    stopwatch.Stop();
    Console.WriteLine($"String Builder took {stopwatch.ElapsedMilliseconds} ms.");
    
    // Make the console window stay open
    // so that you can see the results when running from the IDE.
    Console.WriteLine();
    Console.Write("Press Enter to finish ... ");
    Console.Read();
    
  3. Speichern Sie die Anwendung. Drücken Sie F5, um die Anwendung zu kompilieren und dann auszuführen. Die Konsolenfenster sollten die Ausgabe ähnlich wie in den Beispielen anzeigen:

    Concatenation took 348 ms.
    String Builder took 0 ms.
    Press ENTER to finish...
    
  4. Drücken Sie die EINGABETASTE, um die Ausführung der Anwendung zu beenden und das Konsolenfenster zu schließen.

Problembehandlung

  • Wenn Sie sich in einer Umgebung befinden, die das Streamen der Daten unterstützt, z. B. in einem ASPX-Webformular oder in der Anwendung die Daten auf den Datenträger schreiben, sollten Sie den Pufferaufwand der Verkettung oder des StringBuilderDatenstroms vermeiden und die Daten direkt über die Response.Write Methode oder die entsprechende Methode für den betreffenden Datenstrom in den Datenstrom schreiben.

  • Versuchen Sie, das vorhandene StringBuilder class Zuverwenden, anstatt jedes Mal neu zu verwenden, wenn Sie eins benötigen. Dies begrenzt das Wachstum des Heaps und reduziert die Garbage Collection. In beiden Fällen macht die Verwendung der StringBuilder Klasse den Heap effizienter als die Verwendung des + Operators.

References

Die StringBuilder Klasse enthält viele andere Methoden für die direkte Zeichenfolgenmanipulation, die in diesem Artikel nicht beschrieben werden. Weitere Informationen finden Sie StringBuilder in der Onlinehilfe.