`
aijuans
  • 浏览: 1547772 次
社区版块
存档分类
最新评论

string与StringBuilder 性能差距到底有多大

阅读更多

 

        之前也看过一些对string与StringBuilder的性能分析,总感觉这个应该对整体性能不会产生多大的影响,所以就一直没有关注这块!

        由于学程序初期最先接触的string拼接,所以就一直没改变过自己的习惯!

        前段时间抽时间写了一个CMS系统,一开始的时候每秒钟大概能生成200条新闻,可是后来由于新闻系统与购物系统整合后,发现生成速度突然就掉下来了,最快的时候每秒钟也就生成130多条新闻,按照正常的情况下不应该会出现这个问题的,于是从后期整合的代码里面找原因,由于生成新闻的时候,我们都要提取相关商品的相关信息并输出,而且这些都是用string进行拼接的,由于拼接的次数比较频繁,

突然就想到了这个string与StringBuilder的性能的问题,于是我粗略的做了一个小小的测试!

        用StringBuilder循环的拼接10000次字符串需要的时间为 0到1毫秒!

代码如下:

 

    long tt = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssfff"));          
    StringBuilder start = new StringBuilder();

        for(int j=0;j<10000;j++)
        {
            start.Append("测试测试测试测试测试测试测试测试测试测试测试测试");
        }
        long mm = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssfff"));
        Response.Write(Convert.ToString( mm-tt));
 

用string循环的拼接100000次字符串需要的时间为 5500到6000毫秒!

代码如下:

 

long tt = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssfff"));
        string start =string.Empty;
        
        for(int j=0;j<10000;j++)
        {
            start += "测试测试测试测试测试测试测试测试测试测试测试测试";
        }
        long mm = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssfff"));
        Response.Write(Convert.ToString( mm-tt));
 

         我原本用的是100000 次拼接做的测试,StringBuilder仅用了30毫秒,但是用string拼接就执行几分钟没有执行完,所以我就改用10000次来做试验了!

        简单的可以概括为,string拼接的次数越多,速度则越慢,而StringBuilder则几乎不怎么变化!

string与StringBuilder的性能问题看上去可能很多人觉得没什么,但是一旦操作的次数多了,那么速度就很明显的显示出来了!

       我把所有的关于string的操作都改成了 StringBuilder来操作,再看CMS的生成速度可以达到每秒钟生成300条新闻了!属蛇的人2012年运程属猪的人2012年运程2013年运程2012年运程属虎的人2012年运程

声明:我们的CMS是在配置为  windows2003 vps 服务器, 内存为 1G,数据库为Sqlserver2000,新闻数据量为:20万的的情况下进行测试的,

这样基本已经可以满足我们的要求了!

写程序注意细节,尤其是在搭建比较大型的项目时,细节可能就决定了成败!

更多详细信息请查看  java基础知识 http://www.itchm.com/cainiao/java_basic/

16
19
分享到:
评论
19 楼 yuyue007 2012-05-15  
longfor5 写道
不知道楼主用的是java哪个版本?java5和java6中string字符串的拼接底层已经通过StringBuilder进行拼接。只不过在for循环的情况下String字符串拼接会创建多个StringBuilder,而直接用StringBuilder进行拼接只会创建一个StringBuilder。

+1,你可以看一下编译后的字节码,每次追加字符的时候都创建了一个StringBuilder的
hellostory 写道


我也觉得是这么回事,不知道LZ是什么情况
18 楼 lbb6799928 2012-05-15  
String StringBuffer StringBuilder 这几个面试的时候经常有考官问.String每次操作的时候都会new一个对象拼接字符,当操作频繁的时候速度自然会慢下来占用内存也多。而StringBuffer和StringBuilder是一个缓冲区,在缓冲区内操作速度肯定比String快,但是StringBuilder是线程不安全的,一般比较常用StringBuffer。 既然提到线程,楼主也可以考虑在生成的时候使用多个线程这样效率会更快些。利用分页的原理一个线程处理N条数据,说的不对的地方请多指教
17 楼 huzhiyong56 2012-05-15  
老掉牙的问题了。。
16 楼 jeekchen 2012-05-15  
java6中编译器的对编译时能够确定的字符串连接有做了优化了
但是如果字符串要运行期才能确定的,就必须使用StringBuilder这种方式来提高性能
15 楼 eqzcy 2012-05-15  
longfor5 写道
不知道楼主用的是java哪个版本?java5和java6中string字符串的拼接底层已经通过StringBuilder进行拼接。只不过在for循环的情况下String字符串拼接会创建多个StringBuilder,而直接用StringBuilder进行拼接只会创建一个StringBuilder。


JDK5.0中新增StringBuilder类,如果如你据说,那还有必要增加这个类吗?还不如直接在String 里实现就可以了.
14 楼 ouxitao 2012-05-15  
受教了  
13 楼 cywhoyi 2012-05-15  
1.String每次都分配内存,StringBuilder唯一
2.SB每次开辟更大的空间,容易扩容
3.因条件1,所以采用System.arraycopy方式也不一致
12 楼 shuzheng5201314 2012-05-15  
这就是首页贴吗?
11 楼 last_forever 2012-05-15  
我把所有的关于string的操作都改成了 StringBuilder来操作,再看CMS的生成速度可以达到每秒钟生成300条新闻了!
属蛇的人2012年运程属猪的人2012年运程2013年运程2012年运程属虎的人2012年运程

楼主为什么还插播广告,真不专业啊

10 楼 ricoyu 2012-05-15  
longfor5 写道
不知道楼主用的是java哪个版本?java5和java6中string字符串的拼接底层已经通过StringBuilder进行拼接。只不过在for循环的情况下String字符串拼接会创建多个StringBuilder,而直接用StringBuilder进行拼接只会创建一个StringBuilder。

正解
9 楼 tpei520 2012-05-15  
学习了!!
8 楼 dilantaya2 2012-05-15  
不错 ,很好的测试
7 楼 hahalq 2012-05-15  
StringBuilder性能为啥好,能分析下不?
6 楼 yuhe 2012-05-15  
thingking in java(4th) 里有讲,赞楼主。  有心人一个。
5 楼 superhj1987 2012-05-15  
longfor5 写道
不知道楼主用的是java哪个版本?java5和java6中string字符串的拼接底层已经通过StringBuilder进行拼接。只不过在for循环的情况下String字符串拼接会创建多个StringBuilder,而直接用StringBuilder进行拼接只会创建一个StringBuilder。

+1,你可以看一下编译后的字节码,每次追加字符的时候都创建了一个StringBuilder的
hellostory 写道


嗯,用+拼接字符串现在不存在问题了
4 楼 z276356445t 2012-05-15  
不知道楼主用的是java哪个版本?java5和java6中string字符串的拼接底层已经通过StringBuilder进行拼接。只不过在for循环的情况下String字符串拼接会创建多个StringBuilder,而直接用StringBuilder进行拼接只会创建一个StringBuilder。

+1,你可以看一下编译后的字节码,每次追加字符的时候都创建了一个StringBuilder的
hellostory 写道

3 楼 hellostory 2012-05-15  
不要太追求性能,StringBuilder是非线程安全,StringBuffer是线程安全的
2 楼 java鸵鸟 2012-05-15  
楼主应该调查下,为什么拼接字符窜时String比StringBuilder的性能要查那么多!这样收获会更大!
1 楼 longfor5 2012-05-14  
不知道楼主用的是java哪个版本?java5和java6中string字符串的拼接底层已经通过StringBuilder进行拼接。只不过在for循环的情况下String字符串拼接会创建多个StringBuilder,而直接用StringBuilder进行拼接只会创建一个StringBuilder。

相关推荐

Global site tag (gtag.js) - Google Analytics