Verwenden von Visual C# zum Verbessern der Leistung der Zeichenfolgenverkettung

Dieser Artikel enthält Informationen zum Verbessern der Leistung der Zeichenfolgenverkettung in Visual C#.

Ursprüngliche Produktversion: 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 invarianter Weise (d. a. der Text, auf den verwiesen wird, ist nach der anfänglichen Zuordnung schreibgeschützt). Es bietet viele Leistungsvorteile und stellt einige Herausforderungen für den Entwickler dar, der mit C/C++-Zeichenfolgenbearbeitungstechniken vertraut ist.

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

Beschreibung der Zeichenfolgen im .NET Framework

Eine Technik zur Verbesserung der Zeichenfolgenverkettung strcat() in Visual C/C++ besteht darin, ein array mit großen Zeichen als Puffer zuzuordnen und Zeichenfolgendaten in den Puffer zu kopieren. Im .NET Framework ist eine Zeichenfolge unveränderlich. Sie kann nicht an Ort und Stelle geändert werden. Der C#- + Verkettungsoperator erstellt eine neue Zeichenfolge und führt zu Leistungseinbußen, wenn er große Textmengen verkettet.

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++, das automatische Vergrößern der Puffergröße (falls erforderlich) und die Nachverfolgung der Länge für Sie. 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 mit jeweils 30 Zeichen zu zeitieren. Fügen Sie diesen Code der Standard-Prozedur 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 eine Ausgabe 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 Wenn Ihre Anwendung die Daten auf den Datenträger schreibt, sollten Sie den Pufferaufwand der Verkettung oder von StringBuildervermeiden und die Daten über die Response.Write -Methode oder die entsprechende Methode für den betreffenden Stream direkt in den Stream schreiben.

  • Versuchen Sie, die vorhandene wiederzuverwenden StringBuilder class , anstatt die Zuordnung jedes Mal neu zu erstellen, wenn Sie eine benötigen. Dies begrenzt das Wachstum des Heaps und reduziert die Garbage Collection. In beiden Fällen ermöglicht die Verwendung der StringBuilder -Klasse eine effizientere Verwendung des Heaps 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.