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倍.....   这个就很吓人了,当时就呆了一下,所以在这儿说说,希望大家都能够了解,更优化自己的程序,有可能   大家早就知道了!呵呵!那就见笑了! 就当放点儿分吧!

解决方案 »

  1.   

    呵呵 真相是StringBuilder的性能肯定比string高 至于高多少我公布出来只是让大家更直观的明白使用哪个更好,以后做东西就会注意,但是测试图还真没有,只是我做项目的时候顺便做了一下,当时还没想到要和大家分享!
      

  2.   

    看过相应的文章了 SB 不会产生新实例 String+= 是要产生新实例的
      

  3.   

    0.0我还停留在xxx的初级阶段...
      

  4.   

    可以试试StringBuilder有构造函数一次分配好长度和不指定有没有区别。
      

  5.   

    受教了,以后遇到字符串拼接啥还真得注意了,一直都是用string + 可能数据量小,没发现这个弊端哈。
      

  6.   

    组装字符串StringBuilder不愧是首选
      

  7.   

    其实区别在于StringBuilder和String类的效率差别原因是:在操作字符串时,其实是新建了同样长短的字符串,对其进行替换,查找等等操作,然后再赋值,所以字符串越长操作越慢。在StringBuilder中字符串是分段进行存储,也就是分段进行操作。每一段几乎不太长,操作就很快,内存也会被重复的释放和使用。
      

  8.   

    跟楼主讨论一个问题,当StringBuilder.Append遭遇性能问题之后,有没有更高效率的?目前做一个项目拆包合包很频繁,当请求频繁之后CPU很高,抓dump发现全都hang在StringBuilder.Append,
    有30%以上的CPU都在干这件事情,而这个跟业务相比只是九牛一毛
      

  9.   

    我一般看怎么写方便和易读。
    拼字符串(主要是拼sql)我一般用string.Format(),有时也用+。
    只有在字符频繁拼接时才用SB。23楼的处理数据包难道都是处理字符串?为什么不直接处理二进制呢?
      

  10.   

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

  11.   

    大量的字符串操作本来就是建议使用StringBuilder的,使用string不但效率低,内在空间占用也大。
    其实不管是教材上还是各种资料中,都反复说过这一点,但大多数人都有意无意地忽略了。如果连StringBuilder还不能满足要求的话,我想只有申请一个byte[],直接操作其中的数据了。不过做得不好的话,效率未必及得上StringBuilder。
      

  12.   


    嗯,同意你的第二句,那如果是这样的话,应该就没有更强大的东西可以让append字符串更快了。
      

  13.   

    其实微软把 StringBuilder 这种专门用于经常进行字符串增减的设计操作起来已经很有效率了
    当然这也是相对的, 处理的数据多了,时间肯定会比操作更少的数据长,这个是必然的。这种
    方式不行我们就可以换种思路换种方式去处理,不能吊死在一棵树上嘛! 要 不多可惜!
    就跟操作数据库一样,平常操作少,数据也少我们用access但是数据一旦多了,操作量大了,我们
    就会考虑换个数据库了!
      

  14.   

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