【转】谈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();
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得意的笑着。

 

原文地址:http://www.cnblogs.com/likewind/archive/2010/07/27/1785967.html

posted on 2010-10-05 10:44  kafony  阅读(319)  评论(0编辑  收藏  举报

导航