稀水无痕

稀水无痕

 

为什么StringBuilder比string效率高


我们先看一个例子
string字符串相加
大家都知道字符串对象是“不可变的”,
对字符串进行操作的方法实际上返回的是新的字符串对象。
在前面的示例中,将 s1s2 的内容连接起来以构成一个字符串时,包含 "orange""red" 的两个字符串均保持不变。+= 运算符会创建一个包含组合内容的新字符串。结果是 s1 现在引用一个完全不同的字符串。只包含 "orange" 的字符串仍然存在,但连接 s1 后将不再被引用。
大量的字符串相加的时候就会有很多想s1一样的 不在被引用,从而造成资源的极大浪费.

我们在看看StringBuilder是如何处理这样的问题.
StringBuilder

Append方法,Append里面到底是如何实现的呢.
Append的实现

大家注意这点  string stringValue = this.m_StringValue;

internal volatile string m_StringValue;
写到这里,需要有人见看到了 volatile,也许不明白是什么意思,大概的说下.
volatile关键字实现了线程间数据同步,用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。

换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即
获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的
变量拷贝更为高效。
this.NeedsAllocation(stringValue, requiredLength)
 只有在需要的时候才去重新分配.
 
就分配空间和线程的使用上来讲,StringBuilder肯定比String要高,但是前提是使用频率比较高的情况下.


posted on 2007-09-19 11:18  稀水无痕  阅读(1509)  评论(1编辑  收藏  举报

导航