【转】谈String与StringBuilder的性能
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();
string replaceContent = content.Replace("@param", "哈哈");
watch.Start();
watch.Stop();
Console.WriteLine("String: 长度:{0} >>耗时: {1}", replaceContent.Length, watch.ElapsedMilliseconds);
watch.Reset();
"@param", "哈哈");
watch.Start();
strTest.Replace(
watch.Stop();
Console.WriteLine("StringBuilder: 长度:{0} >>耗时: {1}", strTest.Length, watch.ElapsedMilliseconds);
结果显示:
看到了吧,String 的Replace的耗时比StringBuilder更少,所以这个测试的结论是:String的Replace的性能比StringBuilder更好。至于其他的方法,可以自己测试一下,这里就不列出来了。
结论:那这个小小的测试告诉我们什么呢? “并不是我什么都比你差,你也什么都比我好,嘿嘿…” String得意的笑着。
原文地址:http://www.cnblogs.com/likewind/archive/2010/07/27/1785967.html