不小心被Cglib忽悠了(已纠正错误2009-3-1)最新添加(2009-3-1),纠正文章错误 http://www.iteye.com/topic/3
不小心被Cglib忽悠了(已纠正错误2009-3-1)
最新添加(2009-3-1),纠正文章错误 http://www.iteye.com/topic/336082
ManagelogVO newVO = new ManagelogVO();newVO.setLogid(managelogVO.getLogid());newVO.setOprcode(managelogVO.getOprcode());
2) JDK 反射
Object o = null;try {Class clazz = Class.forName("demo.cglib.ManagelogVO");o = clazz.newInstance();Method setterMethod = null;Method getterMethod = null;Object v = null;setterMethod = clazz.getMethod("setLogid", new Class[]{Long.class});getterMethod = clazz.getMethod("getLogid", null);v = getterMethod.invoke(managelogVO, null);setterMethod.invoke(o, new Object[]{v});setterMethod = clazz.getMethod("setOprcode", new Class[]{String.class});getterMethod = clazz.getMethod("getOprcode", null);v = getterMethod.invoke(managelogVO, null);setterMethod.invoke(o, new Object[]{v}); 3) Cglib Fast反射
Object o = null;try {Class clazz0 = Class.forName("demo.cglib.ManagelogVO");//FastClass clazz = FastClass.create(clazz0);o = clazz.newInstance();FastMethod setterMethod = null;FastMethod getterMethod = null;Object v = null;setterMethod = clazz.getMethod("setLogid", new Class[]{Long.class});getterMethod = clazz.getMethod("getLogid", null);v = getterMethod.invoke(managelogVO, new Object[]{});setterMethod.invoke(o, new Object[]{v});setterMethod = clazz.getMethod("setOprcode", new Class[]{String.class});getterMethod = clazz.getMethod("getOprcode", null);v = getterMethod.invoke(managelogVO, new Object[]{});setterMethod.invoke(o, new Object[]{v}); 通过JProfiler分析,结果类似,并且可以发现 FastClass.getMethod(), FastClass.create(),FastMethod.invoke() 分别是耗时大户,造成性能低下。

5 优化建议:
我的测试用例,基本模拟了真实ORM框架下的一些操作。instance每次创建,method每次都要查找,而由于 getMethod是性能消耗的主要地方,因此,可以考虑对Method做缓存处理,无论对于 JDK反射还是 Cglib fast反射都有一倍以上的性能提高。
1 楼 javatracker 2009-01-12 我的测试结果是JDK反射getMethod耗时是method.invoke的10倍以上,method.invoke耗时是直接调用的100倍以上,method.invoke耗时是fastMethod的2倍不到,也就是说fastMethod比直接反射要快一些,但如果直接反射不作检查的话性能会提高一倍,比fastMethod要快一点 2 楼 joachimz 2009-01-12 getMethod过程中,会构建大量对象,加剧gc,因此缓存Method会有较明显的效果。 3 楼 repsihWDX 2009-01-12 cglib慢在构造fastclass
java实现慢在getMethod和检查 4 楼 raymond2006k 2009-01-12 不知大家有没有搜罗更高效的解决办法。
5 楼 sdh5724 2009-01-12 都像你这么写代码, 还有什么比较地位, CGLIB根本不是这么用的。 CGLIB创建对象是非常消耗时间的。 在一个应用服务器里, 基本是创建一次class, 怎么会像你这样, 把把都是CREATE一个。
求求大家, 别把业界公认的高速度的东西写不规范的代码来比较。 做性能测试有很多前提的, 不能乱CALL API。 要遵循人家的API使用规则。
而且, 对象COPY根本不是这么写的,
BeanCopier :
class MyBeanCopy{
static BeanCopier copy = BeanCopier.create(Bean.class, Bean2.class, false);
void beanCopies(Object source , Object target){
copy.copy(source, target, null);
}
}
6 楼 jltest 2009-01-12 对象不是有个clone的功能么 7 楼 raymond2006k 2009-01-13 sdh5724 写道都像你这么写代码, 还有什么比较地位, CGLIB根本不是这么用的。 CGLIB创建对象是非常消耗时间的。 在一个应用服务器里, 基本是创建一次class, 怎么会像你这样, 把把都是CREATE一个。
求求大家, 别把业界公认的高速度的东西写不规范的代码来比较。 做性能测试有很多前提的, 不能乱CALL API。 要遵循人家的API使用规则。
而且, 对象COPY根本不是这么写的,
BeanCopier :
class MyBeanCopy{
static BeanCopier copy = BeanCopier.create(Bean.class, Bean2.class, false);
void beanCopies(Object source , Object target){
copy.copy(source, target, null);
}
}
多谢提醒。java bean值拷贝时你的方法不错,稍后我也测一下。
不知一般的反射调用,比如:加载配置文件中的类和值定义,初始化到内存对象中,有没有更好的办法(cglib我还没挖掘透,呵呵),就像你提到的 BeanCopier, ps 我指的是一般意义上比较基础的反射操作。 8 楼 sdh5724 2009-02-17 很多中间对象需要你的CACHE的, 不能像你这么写代码。这么比没有什么意义。 CGLIB还有功能是为了实现AOP, 这个东西出现在JDKPROXY之前, 无所谓睡优秀的问题。 9 楼 zhu_chen001 2009-02-19 在数据对象的反射上我使用的是field的setValue方法,这样的速度我测试过一般数据对象可以达到每秒反射4万次以上,可以达到压力测试的要求,但是beanUtil的反射慢多了,但是功能相对来说很强大 10 楼 Scriptlet 2009-02-20 不小心被楼主忽悠了。
感谢sdh5724 11 楼 raymond2006k 2009-02-20 Scriptlet 写道
不小心被楼主忽悠了。感谢sdh5724
真心接受批评,并感谢 sdh5724 指正。
好久没看这个贴了,用 sdh5724 提醒的方式 beanCopier 复制,效率很高,是标准Java反射调用的 1/5.
10000次对象复制测试结果(ms):
task 直接复制 31
task java标准反射复制 610
task cglib Fast复制(不好的写法) 890
task cglib beancopier复制 125 12 楼 sdh5724 2009-02-22 我曾经做的测试结果是100倍。。。。估计JDK的版本, 还有OS版本的影响。你可以测试下, JAVA5/6 OS 32/64的差异。 很大的。 13 楼 niwei 2009-02-25 sdh5724 写道我曾经做的测试结果是100倍。。。。估计JDK的版本, 还有OS版本的影响。你可以测试下, JAVA5/6 OS 32/64的差异。 很大的。
100倍,这个倒不假! 14 楼 starfeng 2009-02-26 半桶水,耸人听闻,误人子弟. 15 楼 raiha 2009-03-02 幸亏我看了回帖,楼主编辑一下主贴吧 ,别再误导了不看回帖的主 16 楼 case0079 2009-03-03 这样作的话不公平啊
17 楼 raymond2006k 2009-03-03 raiha 写道幸亏我看了回帖,楼主编辑一下主贴吧 ,别再误导了不看回帖的主
谢谢提醒。贴子首部已增加声明。