我经过测试发现,使用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倍。
我原来为了做更通用及可替换的系统,对这两个方法可以说是非常看重,但结果很是让我失望。
第一次new某类的时候,两种方法不会有什么区别,因为主要的时间开销都花在了硬盘IO上,要去硬盘找到class文件,读入JVM,进行字节码验证。
Hibernate使用了cglib库,性能远胜JDK1.4的reflection.
与其他项目不同的是,没有schema或其他的配置文件
只是对obj的定义有些要求
中间有大量的Class.forName,new Instance和reflection的操作
xml解析是用dom4j-1.0的
在测试中,jdk1.4比jdk1.3慢了50%
而在实践中,并没有造成瓶颈(我都还没有做cache优化,比如只forName一次)
我觉得这个快慢还是就具体的需求来决定
既然我们的这个系统能用,我相信其他应用系统应该都没有问题 ;ppp
因为这个系统已经是电信生产系统
可能并发用户数还不大,这些问题都不会出现。
有多少个营业员同时在做,就还真的没有统计
不过还没有看到瓶颈出现,富余还是非常多
优化我也已经有考虑了,根据需要再去做,因为满足需求的系统,还是不要去动的好
不过我真的很纳闷为什么jdk1.4比1.3慢
这个结果造成我想up我的server都没有了兴趣,^_^
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了。