String和StringBuilder 的性能比較,網上能找到很多,但是大多數都是比較字符串的連接性能,字 符串的連接 String +=的效率確實不如StringBuilder ,這個大家都能在網上找很多的示例。就這樣,我 們被這些鐵證同化了,我們開始泛濫的使用StringBuilder,StringBuilder 就是B String好,甚至有些 朋友更進一步,對StringBuilder再進行封裝,重載運算符搞個類,來代替String。
但是不是對字符串的一些操作String 都不如StringBuilder呢?
String 和StringBuilder的區別:
1. 雖然兩者都是引用類型,但是在C#中String作為值的時候通常當做結構體一樣處理,例如:我們寫 :
string text = "abc";
text.Replace("a", "b");
是不是這樣,text的值就變了呢?很顯然沒有,我們得這樣寫:
text = text.Replace("a", "b");
還有String作為函數參數的時候,我們是否意識了呢?
如果換做StringBuilder就不需要第三步的代碼了。
2. String 和StringBuilder的方法也並不是完全一樣,這是廢話,當然不會一樣了,那好,那就是他 們也包含相同,相似的功能的方法。
以前我了解到StringBuilder 在連接字符串的時候效率很高,從此以後我就愛屋及烏,只要遇到 String的方法在StringBuilder中有的,就會優先使用 StringBuilder,也沒問為什麼,腦子裡就一個信 仰,StringBuilder真漢子,鐵血真爺們!
這裡,我就開始有些懷疑,難道StringBuilder的中的方法都比String的強嗎?探索精神,耶!
我用的是VS2008,見如下代碼:
string strValue = "this is a test @param ";
StringBuilder strTest = new StringBuilder();
for (long i = 0; i < 1000000; i++)
{
strTest.Append(strValue);
}
string content = strTest.ToString();
Stopwatch watch = new Stopwatch();
watch.Reset();
watch.Start();
string replaceContent = content.Replace("@param", "哈哈");
watch.Stop();
Console.WriteLine("String: 長度:{0} >>耗時: {1}", replaceContent.Length, watch.ElapsedMilliseconds);
watch.Reset();
watch.Start();
strTest.Replace("@param", "哈哈");
watch.Stop();
Console.WriteLine("StringBuilder: 長度:{0} >>耗時: {1}", strTest.Length, watch.ElapsedMilliseconds);
結果顯示:
看到了吧,String 的Replace的耗時比StringBuilder更少,所以這個測試的結論是:String的 Replace的性能比StringBuilder更好。至於其他的方法,可以自己測試一下,這裡就不列出來了。
結論:那這個小小的測試告訴我們什麼呢? “並不是我什麼都比你差,你也什麼都比我好,嘿嘿…” String得意的笑著。