- 浏览: 361676 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (98)
- J2EE (16)
- 杂谈 (10)
- ibatis (1)
- 正则表达式 (2)
- extjs (6)
- plsql developer (1)
- javascript (18)
- oracle (2)
- eclipse (4)
- java (4)
- IT管理 (2)
- 加密解密 (4)
- linux (2)
- web前端 (5)
- chrome (1)
- J2EE hibernate (0)
- ruby (10)
- rails (8)
- mac (1)
- mysql (3)
- luajava (1)
- css (3)
- 分页按钮控件 (1)
- 编程思想 (2)
- github (1)
- 设计模式 (1)
- hibernate (1)
- highcharts (1)
- map (1)
- intelliJ idea (1)
- sql (1)
- maven (1)
- layui (1)
最新评论
-
an8695001:
大神,这个支持ajax获取数据来分页吗?
仿淘宝分页按钮效果简单美观易使用的JS分页控件 -
aspwzmuma:
太好了~感谢作者~~!!
仿淘宝分页按钮效果简单美观易使用的JS分页控件 -
GlacialDrift:
click 模式下面 不能重新初始化吗?
仿淘宝分页按钮效果简单美观易使用的JS分页控件 -
jia_xin:
请问同一个页面可以支持多个分页么?
仿淘宝分页按钮效果简单美观易使用的JS分页控件 -
zhouxi:
有没有完整的代码做参考啊 那个网站必须注册,而且注册还需要邀请 ...
echarts实现环形进度图
在JAVA中拼接两个字符串的最简便的方式就是使用操作符”+”了。如果你用”+”来连接固定长度的字符串,可能性能上会稍受影响,但是如果你是在循环中来”+”多个串的话,性能将指数倍的下降。假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用”+”的话将得到最低的性能。但是究竟这个性能有多差?如果我们同时也把StringBuffer,StringBuilder或String.concat()放入性能测试中,结果又会如何呢?本文将会就这些问题给出一个答案!
我们将使用Per4j来计算性能,因为这个工具可以给我们一个完整的性能指标集合,比如最小,最大耗时,统计时间段的标准偏差等。在测试代码中,为了得到一个准确的标准偏差值,我们将执行20个拼接”*”50,000次的测试。下面是我们将使用到的拼接字符串的方法:
Concatenation Operator (+)
String concat method – concat(String str)
StringBuffer append method – append(String str)
StringBuilder append method – append(String str)
最后,我们将看看字节码,来研究这些方法到底是如何执行的。现在,让我们先开始来创建我扪的类。注意为了计算每个循环的性能,代码中的每段测试代码都需要用Per4J库进行封装。首先我们先定义迭代次数
1 private static final int OUTER_ITERATION=20;
2 private static final int INNER_ITERATION=50000;
接下来,我们将使用上述4个方法来实现我们的测试代码。
01 String addTestStr = "";
02 String concatTestStr = "";
03 StringBuffer concatTestSb = null;
04 StringBuilder concatTestSbu = null;
05 for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
06 StopWatch stopWatch = new LoggingStopWatch("StringAddConcat");
07 addTestStr = "";
08 for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
09 addTestStr += "*";
10 stopWatch.stop();
11 }
12 for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
13 StopWatch stopWatch = new LoggingStopWatch("StringConcat");
14 concatTestStr = "";
15 for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
16 concatTestStr.concat("*");
17 stopWatch.stop();
18 }
19 for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
20 StopWatch stopWatch = new LoggingStopWatch("StringBufferConcat");
21 concatTestSb = new StringBuffer();
22 for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
23 concatTestSb.append("*");
24 stopWatch.stop();
25 }
26 for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
27 StopWatch stopWatch = new LoggingStopWatch("StringBuilderConcat");
28 concatTestSbu = new StringBuilder();
29 for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
30 concatTestSbu.append("*");
31 stopWatch.stop();
32 }
接下来通过运行程序来生成性能指标。我的运行环境是64位的Windown7操作系统,32位的JVM(7-ea) 带4GB内存,双核Quad 2.00GHz的CPU的机器.
经过20次迭代后,我们得到如下的数据:
结果非常完美如我们想象的那样。唯一比较有趣的事情是为什么String.concat也很不错,我们都知道,String是一个常类(初始化后就不会改变的类),那么为什么concat的性能会更好一些呢。(译者注:其实原文作者的测试代码有问题,对于concat()方法的测试代码应该写成concatTestStr=concatTestStr.concat(“*”)才对。)为了回答这个问题,我们应该看看concat反编译出来的字节码。在本文的下载包里面包含了所有的字节码,但是现在我们先看一下concat的这个代码片段:
01 46: new #6; //class java/lang/StringBuilder
02 49: dup
03 50: invokespecial #7; //Method java/lang/StringBuilder."<init>":()V
04 53: aload_1
05 54: invokevirtual #8; //Method java/lang/StringBuilder.append:
06 (Ljava/lang/String;)Ljava/lang/StringBuilder;
07 57: ldc #9; //String *
08 59: invokevirtual #8; //Method java/lang/StringBuilder.append:
09 (Ljava/lang/String;)Ljava/lang/StringBuilder;
10 62: invokevirtual #10; //Method java/lang/StringBuilder.toString:()
11 Ljava/lang/String;
12 65: astore_1
13 66: iinc 7, 1
14 69: goto 38
这段代码是String.concat()的字节码,从这段代码中,我们可以清楚的看到,concat()方法使用了StringBuilder,concat()的性能应该和StringBuilder的一样好,但是由于额外的创建StringBuilder和做.append(str).append(str).toString()的操作,使得concate的性能会受到一些影响,所以StringBuilder和String Cancate的时间是1.8和3.3。
因此,即时在做最简单的拼接时,如果我们不想创建StringBuffer或StringBuilder实例使,我们也因该使用concat。但是对于大量的字符串拼接操作,我们就不应该使用concat(译者注:因为测试代码功能上并不完全等价,更换后的测试代码concat的平均处理时间是1650.9毫秒。这个结果在原文的评论里面。),因为concat会降低你程序的性能,消耗你的cpu。因此,在不考虑线程安全和同步的情况下,为了获得最高的性能,我们应尽量使用StringBuilder
我们将使用Per4j来计算性能,因为这个工具可以给我们一个完整的性能指标集合,比如最小,最大耗时,统计时间段的标准偏差等。在测试代码中,为了得到一个准确的标准偏差值,我们将执行20个拼接”*”50,000次的测试。下面是我们将使用到的拼接字符串的方法:
Concatenation Operator (+)
String concat method – concat(String str)
StringBuffer append method – append(String str)
StringBuilder append method – append(String str)
最后,我们将看看字节码,来研究这些方法到底是如何执行的。现在,让我们先开始来创建我扪的类。注意为了计算每个循环的性能,代码中的每段测试代码都需要用Per4J库进行封装。首先我们先定义迭代次数
1 private static final int OUTER_ITERATION=20;
2 private static final int INNER_ITERATION=50000;
接下来,我们将使用上述4个方法来实现我们的测试代码。
01 String addTestStr = "";
02 String concatTestStr = "";
03 StringBuffer concatTestSb = null;
04 StringBuilder concatTestSbu = null;
05 for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
06 StopWatch stopWatch = new LoggingStopWatch("StringAddConcat");
07 addTestStr = "";
08 for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
09 addTestStr += "*";
10 stopWatch.stop();
11 }
12 for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
13 StopWatch stopWatch = new LoggingStopWatch("StringConcat");
14 concatTestStr = "";
15 for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
16 concatTestStr.concat("*");
17 stopWatch.stop();
18 }
19 for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
20 StopWatch stopWatch = new LoggingStopWatch("StringBufferConcat");
21 concatTestSb = new StringBuffer();
22 for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
23 concatTestSb.append("*");
24 stopWatch.stop();
25 }
26 for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
27 StopWatch stopWatch = new LoggingStopWatch("StringBuilderConcat");
28 concatTestSbu = new StringBuilder();
29 for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
30 concatTestSbu.append("*");
31 stopWatch.stop();
32 }
接下来通过运行程序来生成性能指标。我的运行环境是64位的Windown7操作系统,32位的JVM(7-ea) 带4GB内存,双核Quad 2.00GHz的CPU的机器.
经过20次迭代后,我们得到如下的数据:
结果非常完美如我们想象的那样。唯一比较有趣的事情是为什么String.concat也很不错,我们都知道,String是一个常类(初始化后就不会改变的类),那么为什么concat的性能会更好一些呢。(译者注:其实原文作者的测试代码有问题,对于concat()方法的测试代码应该写成concatTestStr=concatTestStr.concat(“*”)才对。)为了回答这个问题,我们应该看看concat反编译出来的字节码。在本文的下载包里面包含了所有的字节码,但是现在我们先看一下concat的这个代码片段:
01 46: new #6; //class java/lang/StringBuilder
02 49: dup
03 50: invokespecial #7; //Method java/lang/StringBuilder."<init>":()V
04 53: aload_1
05 54: invokevirtual #8; //Method java/lang/StringBuilder.append:
06 (Ljava/lang/String;)Ljava/lang/StringBuilder;
07 57: ldc #9; //String *
08 59: invokevirtual #8; //Method java/lang/StringBuilder.append:
09 (Ljava/lang/String;)Ljava/lang/StringBuilder;
10 62: invokevirtual #10; //Method java/lang/StringBuilder.toString:()
11 Ljava/lang/String;
12 65: astore_1
13 66: iinc 7, 1
14 69: goto 38
这段代码是String.concat()的字节码,从这段代码中,我们可以清楚的看到,concat()方法使用了StringBuilder,concat()的性能应该和StringBuilder的一样好,但是由于额外的创建StringBuilder和做.append(str).append(str).toString()的操作,使得concate的性能会受到一些影响,所以StringBuilder和String Cancate的时间是1.8和3.3。
因此,即时在做最简单的拼接时,如果我们不想创建StringBuffer或StringBuilder实例使,我们也因该使用concat。但是对于大量的字符串拼接操作,我们就不应该使用concat(译者注:因为测试代码功能上并不完全等价,更换后的测试代码concat的平均处理时间是1650.9毫秒。这个结果在原文的评论里面。),因为concat会降低你程序的性能,消耗你的cpu。因此,在不考虑线程安全和同步的情况下,为了获得最高的性能,我们应尽量使用StringBuilder
发表评论
-
国内开源中国镜像settings.xml配置
2015-08-13 11:43 3409mirror <mirror> ... -
Java正确获取星期Calendar.DAY_OF_WEEK
2014-10-17 09:44 42091正确获取星期几(Calendar.DAY_OF_WEE ... -
JAVA开发中数据源创建方法
2014-09-15 11:44 1224数据源是数据库连接池里面的概念,连接池就是指当服务器 ... -
JAVA优秀开源框架收集
2014-08-09 10:05 1638==========Java Core======== * ... -
让DateFormat多线程安全
2014-03-14 18:20 1124"DateFormat 不是同步 ... -
BigInteger类的使用以及计算应该注意的地方
2014-02-25 14:58 3304在java中提供了大数字的操作类,即java.math.B ... -
Java调用Lua脚本(LuaJava使用、安装及Linux安装编译)
2013-11-08 11:09 10878依赖包(附件有下载): 包名类型操作系统luajava-1.1 ... -
Map的高效遍历
2013-05-08 13:40 1143引用场景:偶尔生产环境的某台机器CPU使用率很高,经过定位发现 ... -
Hql查询条件的参数绑定
2013-05-08 13:35 1282Hql查询条件的参数绑定 3. 参数绑定: Hibern ... -
在Eclipse中导入dtd和xsd文件,使XML自动提示
2012-08-14 10:02 4406DTD 类型约束文件 1. Window->Pr ... -
遭遇 Could not initialize class sun.awt.X11GraphicsEnvironment
2012-08-06 10:02 2210一大早来到公司,发现jsp验证码不能显示。查tomcat日志: ... -
ExtJs GridPanel展示Java返回的Date类型数据
2012-07-05 11:23 2357后台Java返回时间对象格式: "lastLogin ... -
【转载】Ibatis (井号)# (美元符号)$ 区别
2012-06-21 14:52 4038Ibatis (井号)# (美元符号)$ 区别 1、#可以进行 ... -
出现Bad version number in .class file这个问题时,要注意三个方面
2012-06-19 17:08 909出现Bad version number in .class ... -
js图片轮换效果 js焦点图代码
2010-11-11 18:08 5176图片轮换效果,在网上有很多了,很多都是fla ... -
java中getResourceAsStream的问题
2010-10-11 11:54 3068在项目使用getResourceAsStream()方法出现了 ... -
在Servlet中获取来源URL
2009-07-30 17:01 9291public void doGet(HttpServletR ...
相关推荐
JAVA的字符串拼接与性能 概述:本文主要研究的是JAVA的字符串拼接的性能,原文中的测试代码在功能上并不等价,导致concat的测试意义不大。不过原作者在评论栏给了新的concat结果,如果有兴趣的同学建议自己修改代码...
在JAVA中拼接两个字符串的最简便的方式就是使用...如果你用”+”来连接固定长度的字符串,可能性能上会稍受影响,但是如果你是在循环中来”+”多个串的话,性能将指数倍的下降,下面我们分析一下JAVA字符串拼接的性能
主要介绍了Java 字符串连接的性能问题分析的相关资料,需要的朋友可以参考下
主要介绍了Java中字符串拼接的一些细节分析,本文着重剖析了字符串拼接的一些性能问题、技巧等内容,需要的朋友可以参考下
可预测的性能。 SIMD 内在函数。 安全的 libc 包装器。 Lisp 语法。 (Clojure,方案) 受 Clojure / Scheme R7RS + libc 启发的标准库。 宏。 REPL:首选但不是关键。 渐进的纯函数式 -> 系统编程。 (Clojure、...
在开发中大家也都会注意尽量使用StringBuilder而不采用普通的字符串拼接方式。但是可能大部分开发者却忽略了js中也需要注意这种效率问题。 下面进行一项性能测试,用事实来说话! 代码如下: function xntest(){ var ...
每拼接一次字符串就循环重复2)~6),如果重复成百上千次则会非常消耗资源,影响性能。 解决方法: 使用 Array 对象存储字符串,之后使用 join()方法输出结果。 仿照 Java 中的 StringBuffer 类。
String“+”拼接也可以用来对字符串进行修改,在String str = “I” + “am” + “String”时候效率比较快,但是在用“+”拼接多个String对象耗费空间且执行效率低下(新建对象、回收对象花费大量时间),特别是当内存...
StringBuilder默认的写法,会为129长度的字符串拼接,合共申请625字符的数组。所以高性能的场景下,永远要考虑用一个ThreadLocal 可重用的StringBuilder。而且重用之后,就不用再玩猜长度的游戏了。
关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不要用StringBuffer,然后性能是好的了,真的吗吗吗吗? 还有些同学,还听过三句似是而非的经验: 1. Java编译优化后+...
java8 源码 Guava学习心得 Guava是一种基于开源的Java库,从源码查看感受到其标准简洁以及对代码有高度的优化。避免了开发过程中充分造...字符串拼接使用StringBuilder(非线程安全)性能较好 但观察其工具方法多可用J
第4~9章重点针对jdk api的使用提出了80条建议,例如字符串的拼接方法该如何选择、枚举使用时有哪些注意事项、出现nullpointerexception该如何处理、泛型的多重界限该如何使用、多线程编程如何预防死锁,等等;...
12.4.2字符串记号处理器和带分隔符的文本 12.4.3读取带允隔符的输入 12.4.4 StringBuilder类 12.4.5随机存取流 12.5对象流 12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3...
二、字符串拼接 $s1='123'; 第一种:$s1=$s1.'456';//这种效率最低下 第二种:$s1.='456';//效率高 第三种:将它存入数组,最后使用impolde函数拼接,效率高。 三、如果有PHP内置函数,请尽量使用内置函数,...
当我们对一个日志框架在做技术选型的时候,除了需要满足业务功能外,另外两个考虑的重要因素...但是在关闭debug日志时,无论是否生效,前者都需要进行字符串转换和字符串拼接,会在内存中产生大量新的对象,后者只是在
另外大概有2秒的性能消耗在字符串拼接缓存中的key造成~ 因此上面带缓存的反射方案可以减2秒~ 看的懂的自己来拿 就1分,相互交流学习·我qq 138071145.长期从事企业web框架和web平台开发等.QQ长期隐身.加了以后发消息...
在一些编程语言中,经常会使用 StringBuilder 类或者类似的字符串缓冲区来拼接大量字符串。对于 C++ 来说,虽然没有专门的 StringBuilder 类,但我们可以通过定义一个字符串变量并利用其自身的 append() 函数来实现...
12.4.2字符串记号处理器和带分隔符的文本 12.4.3读取带允隔符的输入 12.4.4 StringBuilder类 12.4.5随机存取流 12.5对象流 12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3...