如何:增進 Visual C# .NET 中的字串串連效能

文章翻譯 文章翻譯
文章編號: 306822 - 檢視此文章適用的產品。
本文曾發行於 CHT306822
全部展開 | 全部摺疊

在此頁中

結論

本文將示範使用 StringBuilder 類別優於傳統串連技術的地方。在 .NET Framework 中的字串是不變的 (亦即,參考的文字在初始配置後是唯讀的)。這種方式提供了許多效能上的優點,但是也對習慣於 C/C++ 字串操作技術的開發人員帶來了不少挑戰。

.NET Framework 中字串的說明

在 Visual C/C++ 中有一種改善 strcat() 字串串連的方式:配置大型字元陣列作為緩衝區,並且將字串資料複製到這個緩衝區中。在 .NET Framework 中,字串是永遠不變的;它不能在原地被修改。C# + 串連運算子會建置一個新字串,並且會在串連大量文字時導致效能降低。

不過,.NET Framework 包含了一個已對字串串連作最佳化的 StringBuilder 類別。它提供了和在 C/C++ 中使用字元陣列同樣的優點,會視需要自動增加緩衝區大小,並且為您追蹤長度。本文中的範例應用程式將示範使用 StringBuilder 類別並且比較串連性能。

建置並執行示範應用程式

  1. 啟用 Visual Studio .NET 並且建立一個 Visual C# 主控台應用程式 (Console Application)。
  2. 下列程式碼會使用 += 串連運算子 (Concatenation Operator) 和 StringBuilder 類別來計算每 30 個字元的 5,000 次串連的時間。請將這個程式碼加入到 Main 程序。
    const int sLen=30, Loops=5000;
    DateTime sTime, eTime;
    int i;
    string sSource = new String('X', sLen);
    string sDest = "";
    // 
    // Time string concatenation.
    // 
    sTime = DateTime.Now;
    for(i=0;i<Loops;i++) sDest += sSource;
    eTime = DateTime.Now;
    Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");
    // 
    // Time StringBuilder.
    // 
    sTime = DateTime.Now;
    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();
    eTime = DateTime.Now;
    Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");
    // 
    // 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 6.208928 seconds.
    String Builder took 0 seconds.
    
    Press ENTER to finish ...
  4. 按 ENTER 結束應用程式的執行,並且關閉 [主控台] 視窗。

疑難排解

  • 如果您是在可支援資料流的環境 (例如在 ASPX Web Form 中),或者您的應用程式正將資料寫入磁碟,請考慮避免串聯或 StringBuilder 的緩衝區額外負荷,並且透過 Response.Write 方法或對資料流合適的方法將資料直接寫入資料流。
  • 嘗試重複使用現有的 StringBuilder 類別,而不要每次需要時都重新配置。這樣將可限制堆積 (Heap) 的增加並且減少記憶體回收。不論是哪一種情況,使用 StringBuilder 類別都會比使用 + 運算子更有效地運用堆積。

參考

這個 StringBuilder 類別含有許多本文中未說明的其他字串就地操作方法。如需詳細資訊,請在線上說明中搜尋「StringBuilder」。

















本文件是根據 Microsoft Knowledgebase 文件編號 Q306822 翻譯的。若要參考原始英文文件內容,請至以下網址:

http://support.microsoft.com/support/kb/articles/Q306/8/22.asp

屬性

文章編號: 306822 - 上次校閱: 2001年11月2日 - 版次: 1.0
這篇文章中的資訊適用於:
  • Microsoft Visual C# .NET 2002 Standard Edition
關鍵字:?
kbhowto kbhowtomaster KB306822
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com