使用 Visual C# 改善字串串連效能

本文提供如何在Visual C# 中改善字串串連效能的相關信息。

原始產品版本: Visual C#
原始 KB 編號: 306822

摘要

本文說明使用 StringBuilder 類別與傳統串連技術的優點。 Microsoft .NET Framework 中的字串是不變的(也就是說,在初始配置之後參考的文字是只讀的)。 它提供許多效能優點,並給習慣於 C/C++字串操作技術的開發人員帶來一些挑戰。

本文參考 .NET Framework 類別庫命名空間 System.Text

.NET Framework 中的字串描述

改善 Visual C/C++ 中字串 strcat() 串連的其中一個技巧,就是將大型字元陣列配置為緩衝區,並將字串數據複製到緩衝區。 在 .NET Framework 中,字串是不可變的,無法就地修改。 C# + 串連運算符會建置新的字串,並在串連大量文字時造成效能降低。

不過,.NET Framework 包含 StringBuilder 已針對字串串連優化的類別。 它提供與在 C/C++ 中使用字元陣列相同的優點,並自動增加緩衝區大小(如有需要),並追蹤您的長度。 本文中的範例應用程式示範 StringBuilder 如何使用 類別,並比較效能與串連。

建置並執行示範應用程式

  1. 啟動 Visual Studio,然後建立新的 Visual C# 控制台應用程式。

  2. 下列程式代碼會 += 使用串連運算符和 StringBuilder 類別,每個串連 30 個字元的時間為 5,000 個。 將此程式代碼新增至主要程式。

    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. 儲存應用程式。 按 F5 進行編譯,然後執行應用程式。 主控台視窗應該會顯示類似範例的輸出:

    Concatenation took 348 ms.
    String Builder took 0 ms.
    Press ENTER to finish...
    
  4. 按 ENTER 以停止執行應用程式,並關閉主控台視窗。

疑難排解

  • 如果您在支援串流處理數據的環境中,例如在ASPX Web Form 或您的應用程式中將數據寫入磁碟,請考慮避免串連或的緩衝區額外負荷,並透過方法或 StringBuilder有問題的數據流的適當方法直接 Response.Write 將數據寫入數據流。

  • 嘗試重複使用現有的, StringBuilder class 而不是每次需要重新配置。 這會限制堆積的成長並減少垃圾收集。 在任一情況下,使用 StringBuilder 類別比使用 運算子更有效率地使用 + 堆積。

參考資料

類別 StringBuilder 包含許多其他方法,可用於本文未描述的就地字串操作。 如需詳細資訊,請在線上說明中搜尋 StringBuilder