Java性能提供技巧:

03-09-15 banq
http://www.cs.utexas.edu/users/toktb/J-Breeze/javaperform.tips.html

banq
2003-09-15 21:58
该文提到,尽量使用Class.forName动态生成instance。

我经过测试发现,使用CLass.forName获取Class实例后,再使用class.newInstance产生实例,与直接使用New产生实例,速度几乎没有差别。以前我一直以为前者要慢于后者。

wjr
2003-09-17 16:53
>>使用CLass.forName获取Class实例后,再使用class.newInstance产生实例,与直接使用New产生实例,速度几乎没有差别。

就这事,我与许多人争论过,我也做过n多次测试验,还有java.lang.refect.Method.(sun声称在jdk1.4做了优化效率很高).我的测试结果是当new 5万个新对象时,Class.forName后newInstance()要慢4倍。在一个应用系统,生成新的5万个对象,是很平常的事。当然Cache了Class.forName();后,效果要好多,但离直接new 一个对象还有一定距离。还Method的反射机制,情况更差,性能比直接调用对象方法要差10倍。

我原来为了做更通用及可替换的系统,对这两个方法可以说是非常看重,但结果很是让我失望。

banq
2003-09-17 18:16
是这样,Jboss hibernate这些软件使用了专门字节包。

robbin
2003-09-17 18:54
>>我经过测试发现,使用CLass.forName获取Class实例后,再使用class.newInstance产生实例,与直接使用New产生实例,速度几乎没有差别。以前我一直以为前者要慢于后者。

第一次new某类的时候,两种方法不会有什么区别,因为主要的时间开销都花在了硬盘IO上,要去硬盘找到class文件,读入JVM,进行字节码验证。

Hibernate使用了cglib库,性能远胜JDK1.4的reflection.

crogers
2003-10-14 08:57
我这里有一个类来完成xml->obj和obj->xml的操作
与其他项目不同的是,没有schema或其他的配置文件
只是对obj的定义有些要求
中间有大量的Class.forName,new Instance和reflection的操作
xml解析是用dom4j-1.0的
在测试中,jdk1.4比jdk1.3慢了50%
而在实践中,并没有造成瓶颈(我都还没有做cache优化,比如只forName一次)
我觉得这个快慢还是就具体的需求来决定
既然我们的这个系统能用,我相信其他应用系统应该都没有问题 ;ppp
因为这个系统已经是电信生产系统

banq
2003-10-15 18:45
to crogers
可能并发用户数还不大,这些问题都不会出现。

crogers
2003-10-15 20:36
我只能说,这个系统是某个大城市的ADSL营业系统
有多少个营业员同时在做,就还真的没有统计
不过还没有看到瓶颈出现,富余还是非常多

优化我也已经有考虑了,根据需要再去做,因为满足需求的系统,还是不要去动的好
不过我真的很纳闷为什么jdk1.4比1.3慢
这个结果造成我想up我的server都没有了兴趣,^_^

noxel
2003-10-22 16:53
我刚比较过new ,clone,newInstance的性能

sun 1.4.1,win2000 pro,p4
结果发现在 重复100,000次


(单位毫秒)
construct cost 16

clone cost 78

reflect cost 62
而constuct 很稳定,其次是reflect,有少量波动31-67之间,clone最不稳定,50-250,创建的对象只是一个有int成员变量的类,而且clone也没有对它赋值。

我的结论:clone是sun的历史遗留特性,使用及其不方便。sun不会优化,所以不推荐使用
(doug lea 就一直主张自己写个duplicate)

reflect 1.4 之后优化了很多,需要灵活性时推荐使用。

最死板,最快的当然就是new了。

iceant
2003-10-26 23:25
不能只考虑性能~~ 面对有些应用,特别是在做服务器时,像 Reflect 这些特性提供了很强的灵活性,相比之下,我会牺牲一些性能来换取这样的灵活性。一旦性能真的成了应用的瓶颈,那大不了就直接在内存里写二进制动态生成 class 咯~ 这比硬盘 IO 要强~~,当然程序的可读性就没有了~~, 只能多写注释了~~