這期的 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( ) ;
}
沒有留言:
張貼留言