Verwenden von Visual C# zur Verbesserung der Zeichenfolgenverkettungsleistung

Dieser Artikel enthält Informationen zur Verbesserung der Leistung von Zeichenfolgenverkettung in Visual C#.

Originalversion des Produkts:   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 invariante Zeichenfolgen (d. a. der referenzierte Text ist nach der anfänglichen Zuordnung schreibgeschützt). Es bietet viele Leistungsvorteile und stellt Entwickler, die mit C/C++-Zeichenfolgenmanipulationstechniken vertraut sind, vor einige Herausforderungen.

Dieser Artikel bezieht sich auf den .NET Framework KlassenbibliotheksnamespaceSystem.Text.

Beschreibung von Zeichenfolgen im .NET Framework

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

Die .NET Framework enthält jedoch eine StringBuilder Klasse, die für die Zeichenfolgenverkettung optimiert ist. Es bietet die gleichen Vorteile wie die Verwendung eines Zeichenarrays in C/C++, wobei die Puffergröße (falls erforderlich) automatisch vergrößert und die Länge für Sie nachverfolgt wird. Die Beispielanwendung in diesem Artikel veranschaulicht die Verwendung der StringBuilder Klasse und vergleicht die Leistung mit der Verkettung.

Erstellen und Ausführen einer Demonstrationsanwendung

  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 5.000 Verkettungen von jeweils 30 Zeichen zu zeitieren. 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. In den Konsolenfenstern sollte die Ausgabe ähnlich den Beispielen angezeigt werden:

    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 wenn Ihre Anwendung die Daten auf den Datenträger schreibt, sollten Sie den Pufferaufwand der Verkettung oder des StringBuilderDatenstroms vermeiden und die Daten direkt über die Methode oder die entsprechende Methode für den betreffenden Datenstrom in den Response.Write Datenstrom schreiben.

  • Versuchen Sie, das Vorhandene wiederzuverwenden StringBuilder class , anstatt jedes Mal neu zu lokalisieren, wenn Sie eines benötigen. Dies schränkt das Wachstum des Heaps ein und reduziert die Garbage Collection. In beiden Fällen verwendet die Verwendung der Klasse den StringBuilder Heap effizienter als die Verwendung des + Operators.

References

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