您目前已離線,請等候您的網際網路重新連線

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

本文曾發行於 CHT306822
本文是討論一項 Microsoft 產品的 Beta 版本。本文中資訊是依現況提供,可能會不經通知而逕行變更。

對此 Beta 版本產品,Microsoft 還沒有正式的產品支援。如需取得 Beta 版本產品支援的相關資訊,請參閱隨附於 Beta 產品檔案中的文件,或查閱您下載此版本的 Web 位置。如需本文的 Microsoft Visual Basic .NET 版本,請參閱 306821

目前工作內容

結論
本文將示範使用 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 翻譯的。若要參考原始英文文件內容,請至以下網址:

內容

文章識別碼:306822 - 最後檢閱時間:11/02/2001 16:59:00 - 修訂: 1.0

Microsoft Visual C# .NET 2002 Standard Edition

  • kbhowto kbhowtomaster KB306822
意見反應