[C#.NET] 動態處理字串 - StringBuilder 類別 與 String 類別的效能

  • 38296
  • 0
  • C#
  • 2013-07-05

[C#.NET] 動態處理字串 - StringBuilder 類別 與 String 類別的效能

String 類別 每次動態處理資料時會捨棄舊有的記憶體,然後再配置一個新的記憶體給它,雖然最終程式會交由GC回收,但是在回收之前資源卻已經浪費掉了。

StringBuilder 類別 則是會維護一個緩衝區,以容納新資料,如果有可用的空間,新的資料會附加至緩衝區的尾端;若緩衝區不夠的話它會新增一個較大的緩衝區並把舊有的資料複製過去,新的資料再附加至緩衝區的尾端。

但是若是在固定字串的話使用 string 類別,效能就不比 StringBuilder 類別 差了。

比較常見的例子是我們在處理迴圈的時候,一定會需要動態處理字串,以下我就來做個比較:


public string LoopString()
{
    string str = "";
    for (int i = 0; i < 10; i++)
    {
        str += i.ToString();
    }
    return str;
}
public System.Text.StringBuilder LoopBuild()
{
    System.Text.StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; i++)
    {
        sb.Append(i.ToString());
    }
    return sb;
}

用單元測試觀察兩個方法的執行結果,在迴圈數不大的情況下,很明險的兩者差了將近十倍的執行時間。

image

 

若是把迴圈數量提高到100000的話,差異性更是明顯,這是差幾倍不會算了。

image

 

 

接下來,再來觀察若是在固定字串下,兩者的效能會是如何呢


public string StaticString()
{
    string str = "1234567890";
    return str;
}
public StringBuilder StaticBuild()
{
    StringBuilder sb = new StringBuilder("1234567890");
    return sb;
}

唉唷!情況反過來了,這時候的String類別大勝 StringBuilder 類別

image

 

結論:

動態處理字串最好選用StringBuilder 類別 ,靜態處理則選用String類別。

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo