搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
楼主: coolcfan
收起左侧

[普通教程] [翻译] Java字符串连接性能内幕

[复制链接]

该用户从未签到

24

主题

35

好友

5097

积分

序章

积分
5097
发表于 2012-11-1 23:04:18 | 显示全部楼层
麻麻说过 不比较不同JVM优化的性能比较都是耍流氓..............
Arrays.copyOf的源码不放上来就不好说啦~~~
[mw_shl_code=java,true]    public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }[/mw_shl_code]
不知道为什么感觉这文章没有从JVM的层次去分析有点不太好..........说不出来哪里不好....就是感觉怪怪的....
而且感觉这文章是来”卖产品“的..........
之所以要用java自带的类还是为了方便更新和扩展吧  毕竟自带的类库还是不断在扩充 改变更新的 上次瞄了一眼ArrayList JDK6和JDK7 好像有一些变化 多了一个检查...忘记了..上次为了做作业 就直接copy源码时瞥见的....
好啦 无视我吧
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

5

好友

1224

积分

Continue

积分
1224
 楼主| 发表于 2012-11-12 23:03:53 | 显示全部楼层
本帖最后由 coolcfan 于 2012-11-12 23:24 编辑

#40!

我们的优化主要针对Hotspot VM

但是不管JVM使用何种内存结构、何种GC算法,虽不能排除可能存在的极少数情况,但对于大多数情况,减少垃圾的生成对性能的影响总是积极的。

关于字符串的操作,最近恰好有某知名程序员的博客讨论:

如何生成一段Typoglycemia文本?问题:http://blog.zhaojie.me/2012/11/h ... oglycemia-text.html
解答:http://blog.zhaojie.me/2012/11/h ... ia-text-result.html

这里也是主要为性能考虑。作者主要用C#,但是回复里也有Java代码。这里对性能的分析,也是在C#和Java代码的层次上分析。

我编写的答案,思路和博主给出的解答是差不多的,不过我代码写的比较笨,而且还有个功能上的小bug。
https://gist.github.com/4023720

解答的思路还是出于
1、字符串的内置字符数组是不能被修改的(除非。。。反射?)
2、减少操作过程中字符数组的建立和丢弃。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

35

好友

5097

积分

序章

积分
5097
发表于 2012-11-13 22:02:42 | 显示全部楼层
coolcfan 发表于 2012-11-12 23:03
我们的优化主要针对Hotspot VM

但是不管JVM使用何种内存结构、何种GC算法,虽不能排除可能存在的 ...

嗯 嗯 嗯
好多谢解答~~~~~~~
不过哦...注意呢 也许是我个人的问题呢.......
我装完JDK 用eclipse 好像默认的是PS scavenge 和 ps MarkSweep 而不是serialGC.....
哎 哎  我再仔细的读一下 ~~~感谢详细的回答 (其实我真的很菜....)
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

5

好友

1224

积分

Continue

积分
1224
 楼主| 发表于 2012-11-16 21:54:09 | 显示全部楼层
fair_jm 发表于 2012-11-13 22:02
嗯 嗯 嗯
好多谢解答~~~~~~~
不过哦...注意呢 也许是我个人的问题呢.......

关键点在减少垃圾生成上,这个是跟GC无关的——因为GC是是在垃圾生成之后去清理垃圾释放被占用的内存,而让操作中垃圾生成的数量更少,或者说,让垃圾生成的速度更慢,则是想办法去阻止垃圾的产生。垃圾产生的速度慢了,GC的压力就会减轻,更多的CPU时间可以用来为你的程序服务,就是此类优化的意义。

另外,文中所讲的东西,对于一个单线程、服务单个用户的程序,可以说几乎没有意义。但是在一个可能同时需要响应大量请求的网站里,绞尽脑汁去优化就绝对是有必要的了。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

5

好友

1224

积分

Continue

积分
1224
 楼主| 发表于 2012-11-16 22:01:45 | 显示全部楼层
fair_jm 发表于 2012-11-13 22:02
嗯 嗯 嗯
好多谢解答~~~~~~~
不过哦...注意呢 也许是我个人的问题呢.......

P.S. 那个生成typoglycemia文本的题,给出的答案里,先是直接将一个String转为一个数组,直接在这个数组上操作,然后再用这个数组生成新的String。对于这样一个String makeTypoglycemia(String input)方法来说,如果将输入(input)和输出(返回值)忽略,那么这个算法过程中只产生一个大块垃圾,就是那个中间数组。

两篇博文的后面有很多参与者给出的回答。拿第一篇博文里给出的那个段落作为输入,去分析分析每一种回答所给出算法的垃圾生成情况,也会是一件很有趣的事情的说~~
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-5-2 07:39 , Processed in 0.078590 second(s), 17 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表