本文提供如何在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 如何使用 類別,並比較效能與串連。
建置並執行示範應用程式
啟動 Visual Studio,然後建立新的 Visual C# 控制台應用程式。
下列程式代碼會
+=使用串連運算符和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();儲存應用程式。 按 F5 進行編譯,然後執行應用程式。 主控台視窗應該會顯示類似範例的輸出:
Concatenation took 348 ms. String Builder took 0 ms. Press ENTER to finish...按 ENTER 以停止執行應用程式,並關閉主控台視窗。
疑難排解
如果您在支援串流處理數據的環境中,例如在ASPX Web Form 或您的應用程式中將數據寫入磁碟,請考慮避免串連或的緩衝區額外負荷,並透過方法或
StringBuilder有問題的數據流的適當方法直接Response.Write將數據寫入數據流。嘗試重複使用現有的,
StringBuilder class而不是每次需要重新配置。 這會限制堆積的成長並減少垃圾收集。 在任一情況下,使用StringBuilder類別比使用 運算子更有效率地使用+堆積。
參考資料
類別 StringBuilder 包含許多其他方法,可用於本文未描述的就地字串操作。 如需詳細資訊,請在線上說明中搜尋 StringBuilder 。