2008年2月9日 星期六

[Note] String 與 StringBuilder 之效能

.NET Framework SDK 中提供了另一種特別的 String 類別,其名為 StringBuilder,當你有大量字串要"連接"起來時,可以使用 StringBuilder 來提昇效能,因為如果你宣告一個 String 變數並給它值,日後要改變值的話,就要放棄原本的那塊記憶體,而再配置一塊新的記憶體來存放新值,如果改變值的動作很頻繁則會大大地降低效能,而 StringBuilder 就是用來解決這個問題。

這期的 RunPC 做了個實驗來比較兩者的差異,一開始原作者分別使用 String 與 StringBuilder 來連接大量的靜態子字串如下,結果效能居然是 String 較佳,而差異大概有十倍,這是怎麼回事呢。原因在於我們連結接是靜態的字串,Compiler 在 編譯時期就會幫他們做最佳化,而連接在一起,所以 String 的 Case 等於什麼都做,當然比 StringBuilder 快很多,接著我們改成動態字串 (Run Time 才決定的字串),效能比較就如我們預期,由 StringBuilder 獲勝。

因此,在你決定用 String 或 StringBuilder 時,最好先考慮一下字串被"決定"的 時機,在 Compile Time 或是 Run Time 呢?
public string ConnectStrings_string( )
{
string tmp = "" ;

tmp += "11111111111111111111111111111111111111111111111111111111111"  ;

tmp += "2222222222222222222222222222222222222222222222222222"   ;

tmp += "3333333333333333333333333333333333333333333333333333"  ;

// 中間略

tmp += "100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100"  ;

return tmp ;

}

public string ConnectStrings_stringbuilder( )
{
StringBuilder tmp = "" ;

tmp.Append( "11111111111111111111111111111111111111111111111111111111111"  );

tmp.Append( "2222222222222222222222222222222222222222222222222222"  ) ;

tmp.Append( "3333333333333333333333333333333333333333333333333333"  );

// 中間略

tmp.Append( "100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100" ) ;

return tmp.ToString( ) ;

}

沒有留言: