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

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。

相关推荐

    String和StringBuilder类的区别

    - **StringBuilder**:由于 `StringBuilder` 允许在原有对象上进行修改,因此在进行字符串拼接等操作时,其性能通常优于 `String`。特别是当字符串拼接操作非常频繁时,这种性能优势尤为明显。 #### 3. 使用场景 -...

    String、StringBuilder和StringBuffer的区别

    在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...

    测试string的+和String.Format()和StringBuilder.Append()性能差距|TestForString.7z

    `String.Format()`则在需要格式化输出的场合更有优势,但性能上不及`StringBuilder`。了解这些性能差异有助于编写出更高效的代码,特别是在处理大数据量或性能敏感的场景中。在实际开发中,应该根据具体情况权衡效率...

    String StringBuffer和StringBuilder区别之源码解析

    "String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、...我们可以看到,String、StringBuffer和StringBuilder类各有其优缺,选择合适的字符串类是非常重要的。

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...

    String ,StringBuffer与StringBuilder

    String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...

    String和StringBuilder效率测试

    在Java编程语言中,`String`和`StringBuilder`都是用于处理字符串的重要类,但它们在处理方式和效率上有显著的区别。本资源中的代码是针对这两种类的效率进行测试的实例,旨在帮助开发者理解它们在不同场景下的性能...

    从内存方面解释Java中String与StringBuilder的性能差异.docx

    在Java编程中,String与StringBuilder都是用来处理字符串的类,但它们在性能上有显著的差异,这主要体现在内存管理和操作效率上。理解这些差异对于优化代码性能至关重要。 首先,String对象在Java中是不可变的,这...

    String、StringBuffer与StringBuilder之间区别

    String:字符串常量  StringBuffer:字符创变量  StringBuilder:字符创变量  从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段...

    String、StringBuilder、StringBuffer 用法比较

    stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...

    Java-Java String和StringBuilder

    总结来说,Java中的String和StringBuilder各有优劣: - String:不可变,线程安全,适用于不需要频繁修改字符串的场景。 - StringBuilder:可变,性能更高,适用于大量字符串操作的场合,单线程环境首选。 - ...

    String-StringBuffer-StringBuilder

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...

    String及StringBuffer和StringBuilder的区别

    String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...

    从内存方面解释Java中String与StringBuilder的性能差异

    总的来说,理解Java中String、StringBuilder和StringBuffer的性能差异和使用场景,可以帮助我们编写出更高效、更适应多线程环境的代码。在处理少量字符串拼接时,+号操作符可能是方便的选择,但在大量拼接或多线程...

    String、StringBuilder、StringBuffer的区别

    String、StringBuilder、StringBuffer的区别 在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这...

    字符串、String类和StringBuilder类

    与String不同,StringBuilder对象可以在原地修改,不需要每次操作都创建新的对象。因此,当你需要频繁地进行字符串操作,如循环拼接,StringBuilder通常是更好的选择。它提供了一系列方法,如Append、Insert、Remove...

    String&StringBuffer&StringBuilder三者之间的区别-经典解析.doc

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自有特定的使用场景和特性。理解这三个类的区别对于任何Java开发者,无论是初学者还是经验丰富的程序员,都是非常重要的...

    Java中String,StringBuffer与StringBuilder的区别

    Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别和用法。 首先,让我们从 String 类型开始。String 类型...

    string,stringbuffer,stringbuilder

    string,stringbuffer,stringbuilder

Global site tag (gtag.js) - Google Analytics