锁定老帖子 主题:java反射的性能问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-13
最后修改:2009-02-22
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-13
动态字节码生成就好了。
|
|
返回顶楼 | |
发表时间:2008-11-13
大猫汤姆 写道 性能问题。
很多IOC,还有框架都使用反射。 特别是在通过反射调用方法的时候,与普通方法调用的性能相差数百倍(本机测出来是300倍以上)。 反射的确方便了编程,代码更合理更美观。300倍在一般应用上面也算不得什么,不过很多地方都用反射那问题就明显了。IOC用到,AOP用到,HIBERNATE要用也许还有别的。真是进退两难 大家快来谈谈,交流一下 -server模式下,差别没这么大,某个Method对象反复invoke,jvm会进一步优化这个反射 |
|
返回顶楼 | |
发表时间:2008-11-13
1.反射性能没那么离谱。。30倍左右。
2.cglib实现了对类的动态字节码生成,用switch方式来轮询内省方法。速度差不多是正常方法掉用时间的2~3倍。 3.java反射如果去掉访问检查速度和cglib后的方法调用耗时基本相同。 |
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
repsihWDX 写道 1.反射性能没那么离谱。。30倍左右。
2.cglib实现了对类的动态字节码生成,用switch方式来轮询内省方法。速度差不多是正常方法掉用时间的2~3倍。 3.java反射如果去掉访问检查速度和cglib后的方法调用耗时基本相同。 是不是你测试的压力比较小?压力小差别是不太大的,我调用了一亿次比较得出来的。 calib我去研究测试一下,看样子用了这个动态字节码技术情况会好很多的 |
|
返回顶楼 | |
发表时间:2008-11-13
setAccessible(true);
以后再试试:) 如果还觉得不爽,可以cache类中的方法再试试^_^ |
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
repsihWDX 写道 setAccessible(true);
以后再试试:) 如果还觉得不爽,可以cache类中的方法再试试^_^ 取消访问性检查速度快多了 一下子提高了十倍,原来是300多倍,现在是30倍左右 |
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-14
多谢各位高人呀,用了CGLIB后,也就是说现在的调用速度是普通方法调用的12倍左右。 反射还是有些影响的。
后来又测了一下,与普通方法调用相比: 发现spring反射代理调用方法与JAVA反射方法直接调用性能差不多,SPRING是400倍以上,JAVA是300倍, CGLIB代理速度最快 12倍 JAVA去除安全性检查速度其次 14倍
上面测试结果只是在main函数上测试的,其它情况估计差不太多。
对SPRING的IOC进行了简单测试,factory.getBean(""),效率很低。 在这里没有说SPRING如何如何,SPRING 粉丝不要误会,只是分析分析 |
|
返回顶楼 | |
发表时间:2008-11-14
大猫汤姆 写道 多谢各位高人呀,用了CGLIB后,也就是说现在的调用速度是普通方法调用的12倍左右。 反射还是有些影响的。
后来又测了一下,与普通方法调用相比: 发现spring反射代理调用方法与JAVA反射方法直接调用性能差不多,SPRING是400倍以上,JAVA是300倍, CGLIB代理速度最快 12倍 JAVA去除安全性检查速度其次 14倍
上面测试结果只是在main函数上测试的,其它情况估计差不太多。
对SPRING的IOC进行了简单测试,factory.getBean(""),效率很低。 在这里没有说SPRING如何如何,SPRING 粉丝不要误会,只是分析分析 “调用速度是普通方法调用的12倍” 这个蛮误导人的,楼主的意思应该是慢12倍吧 |
|
返回顶楼 | |
发表时间:2008-11-16
kaneg 写道 这个蛮误导人的,楼主的意思应该是慢12倍吧 你说的对极了,是慢。 |
|
返回顶楼 | |