c# StringBuilder 效率实战(说不定对你有帮助哦)

zjx198934 2010-07-21 04:26:18
String 对象是不可改变的。每次使用 System.String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。而 StringBuilder 则不会。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

1.它是引用类型,在堆上分配内存

2.运算时会产生一个新的实例

3.String 对象一旦生成不可改变(Immutable)

3.定义相等运算符(== 和 !=)是为了比较 String 对象的值(而不是引用)


以上是结合一些资料的说明 很明显可以发现在组装字符串用StringBuilder是毫不犹豫的

可大家都知道StringBuilder效率高 但是它的Append,AppendFormat比 string str +=效率高多少呢?

由于最近的项目需要,大多都是采用AJAX技术,就需要在中间件传大量的格式化数据到JS层,就顺便做了

一个测试:
在数据较少的时候效率其实差别不大,主要是内存的开销有差别

可数据一旦较大,用StringBuilder.Append要比string str +=快上约30倍.....

这个就很吓人了,当时就呆了一下,所以在这儿说说,希望大家都能够了解,更优化自己的程序,有可能

大家早就知道了!呵呵!那就见笑了! 就当放点儿分吧!
...全文
711 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjx198934 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 soaringbird 的回复:]

引用 26 楼 grandia 的回复:

纯讨论哈。各种协议栈多半都会有这样的操作,当然拼sql一般达不到这个级别,
又或者比如一个7层负载?

这个一般都是操作byte[]的吧?很少有人按字符串操作的
[/Quote]

的确如此!
ICANNER 2010-07-21
  • 打赏
  • 举报
回复
谢谢分享 接分了
leiziaitudou 2010-07-21
  • 打赏
  • 举报
回复
顶LZ
soaringbird 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 grandia 的回复:]

纯讨论哈。各种协议栈多半都会有这样的操作,当然拼sql一般达不到这个级别,
又或者比如一个7层负载?
[/Quote]
这个一般都是操作byte[]的吧?很少有人按字符串操作的
lyy_0814 2010-07-21
  • 打赏
  • 举报
回复
谢谢楼主的分享,如果以后涉及到相关的,还希望楼主分享出来,大家共同学习,讨论研究啊!
jbz001 2010-07-21
  • 打赏
  • 举报
回复
写的不错~!
zjx198934 2010-07-21
  • 打赏
  • 举报
回复
其实微软把 StringBuilder 这种专门用于经常进行字符串增减的设计操作起来已经很有效率了
当然这也是相对的, 处理的数据多了,时间肯定会比操作更少的数据长,这个是必然的。这种
方式不行我们就可以换种思路换种方式去处理,不能吊死在一棵树上嘛! 要 不多可惜!
就跟操作数据库一样,平常操作少,数据也少我们用access但是数据一旦多了,操作量大了,我们
就会考虑换个数据库了!
Grandia 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 dancingbit 的回复:]

大量的字符串操作本来就是建议使用StringBuilder的,使用string不但效率低,内在空间占用也大。
其实不管是教材上还是各种资料中,都反复说过这一点,但大多数人都有意无意地忽略了。

如果连StringBuilder还不能满足要求的话,我想只有申请一个byte[],直接操作其中的数据了。不过做得不好的话,效率未必及得上StringBuilder。
[/Quote]

嗯,同意你的第二句,那如果是这样的话,应该就没有更强大的东西可以让append字符串更快了。
dancingbit 2010-07-21
  • 打赏
  • 举报
回复
大量的字符串操作本来就是建议使用StringBuilder的,使用string不但效率低,内在空间占用也大。
其实不管是教材上还是各种资料中,都反复说过这一点,但大多数人都有意无意地忽略了。

如果连StringBuilder还不能满足要求的话,我想只有申请一个byte[],直接操作其中的数据了。不过做得不好的话,效率未必及得上StringBuilder。
Grandia 2010-07-21
  • 打赏
  • 举报
回复
纯讨论哈。各种协议栈多半都会有这样的操作,当然拼sql一般达不到这个级别,
又或者比如一个7层负载?
zjx198934 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 grandia 的回复:]

跟楼主讨论一个问题,当StringBuilder.Append遭遇性能问题之后,有没有更高效率的?

目前做一个项目拆包合包很频繁,当请求频繁之后CPU很高,抓dump发现全都hang在StringBuilder.Append,
有30%以上的CPU都在干这件事情,而这个跟业务相比只是九牛一毛。。。
[/Quote]
我也有24楼同样的疑问,是什么样的需求导致需要这样的操作呢?能说详细点儿吗?
soaringbird 2010-07-21
  • 打赏
  • 举报
回复
我一般看怎么写方便和易读。
拼字符串(主要是拼sql)我一般用string.Format(),有时也用+。
只有在字符频繁拼接时才用SB。

23楼的处理数据包难道都是处理字符串?为什么不直接处理二进制呢?
Grandia 2010-07-21
  • 打赏
  • 举报
回复
跟楼主讨论一个问题,当StringBuilder.Append遭遇性能问题之后,有没有更高效率的?

目前做一个项目拆包合包很频繁,当请求频繁之后CPU很高,抓dump发现全都hang在StringBuilder.Append,
有30%以上的CPU都在干这件事情,而这个跟业务相比只是九牛一毛。。。

peijiping 2010-07-21
  • 打赏
  • 举报
回复
支持楼主,但不知道在拼接操作多少次以上或拼接多长的字符串以上效率才可以明显显露出来?
zjx198934 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 keke8330 的回复:]
其实区别在于StringBuilder和String类的效率差别原因是:在操作字符串时,其实是新建了同样长短的字符串,对其进行替换,查找等等操作,然后再赋值,所以字符串越长操作越慢。在StringBuilder中字符串是分段进行存储,也就是分段进行操作。每一段几乎不太长,操作就很快,内存也会被重复的释放和使用。
[/Quote]
是这个道理!
fxie8908 2010-07-21
  • 打赏
  • 举报
回复
嗯,学习了,今天刚看了字符串方面的内容,现在又多学了一点。。
粥是稀饭 2010-07-21
  • 打赏
  • 举报
回复
其实区别在于StringBuilder和String类的效率差别原因是:在操作字符串时,其实是新建了同样长短的字符串,对其进行替换,查找等等操作,然后再赋值,所以字符串越长操作越慢。在StringBuilder中字符串是分段进行存储,也就是分段进行操作。每一段几乎不太长,操作就很快,内存也会被重复的释放和使用。
wcq2008 2010-07-21
  • 打赏
  • 举报
回复
组装字符串StringBuilder不愧是首选
zjx198934 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 kissxyl 的回复:]
可以试试StringBuilder有构造函数一次分配好长度和不指定有没有区别。
[/Quote]
的确 指定了长度后,说不定性能更会有所提升! 下去试试!
mayonglong 2010-07-21
  • 打赏
  • 举报
回复
写的不错·~
加载更多回复(15)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧