论坛首页 Java企业应用论坛

java反射的性能问题

浏览 18028 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2008-11-13   最后修改:2009-02-22
yyyhbfl
   发表时间:2008-11-13  
动态字节码生成就好了。
0 请登录后投票
   发表时间:2008-11-13  
大猫汤姆 写道
性能问题。

很多IOC,还有框架都使用反射。
特别是在通过反射调用方法的时候,与普通方法调用的性能相差数百倍(本机测出来是300倍以上)。

反射的确方便了编程,代码更合理更美观。300倍在一般应用上面也算不得什么,不过很多地方都用反射那问题就明显了。IOC用到,AOP用到,HIBERNATE要用也许还有别的。真是进退两难

大家快来谈谈,交流一下

-server模式下,差别没这么大,某个Method对象反复invoke,jvm会进一步优化这个反射
0 请登录后投票
   发表时间:2008-11-13  
1.反射性能没那么离谱。。30倍左右。
2.cglib实现了对类的动态字节码生成,用switch方式来轮询内省方法。速度差不多是正常方法掉用时间的2~3倍。
3.java反射如果去掉访问检查速度和cglib后的方法调用耗时基本相同。
0 请登录后投票
   发表时间:2008-11-13   最后修改:2008-11-13
repsihWDX 写道
1.反射性能没那么离谱。。30倍左右。
2.cglib实现了对类的动态字节码生成,用switch方式来轮询内省方法。速度差不多是正常方法掉用时间的2~3倍。
3.java反射如果去掉访问检查速度和cglib后的方法调用耗时基本相同。


是不是你测试的压力比较小?压力小差别是不太大的,我调用了一亿次比较得出来的。

calib我去研究测试一下,看样子用了这个动态字节码技术情况会好很多的
0 请登录后投票
   发表时间:2008-11-13  
setAccessible(true);
以后再试试:)
如果还觉得不爽,可以cache类中的方法再试试^_^
0 请登录后投票
   发表时间:2008-11-13   最后修改:2008-11-13
repsihWDX 写道
setAccessible(true);
以后再试试:)
如果还觉得不爽,可以cache类中的方法再试试^_^

取消访问性检查速度快多了
一下子提高了十倍,原来是300多倍,现在是30倍左右
0 请登录后投票
   发表时间: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 粉丝不要误会,只是分析分析

0 请登录后投票
   发表时间:2008-11-14  
大猫汤姆 写道

多谢各位高人呀,用了CGLIB后,也就是说现在的调用速度是普通方法调用的12倍左右。
看来反射早已经不再是性能问题了。

反射还是有些影响的。

 

后来又测了一下,与普通方法调用相比:

发现spring反射代理调用方法与JAVA反射方法直接调用性能差不多,SPRING是400倍以上,JAVA是300倍,

CGLIB代理速度最快 12倍

JAVA去除安全性检查速度其次 14倍

 

上面测试结果只是在main函数上测试的,其它情况估计差不太多。

 

对SPRING的IOC进行了简单测试,factory.getBean(""),效率很低。

在这里没有说SPRING如何如何,SPRING 粉丝不要误会,只是分析分析


“调用速度是普通方法调用的12倍” 这个蛮误导人的,楼主的意思应该是慢12倍吧
0 请登录后投票
   发表时间:2008-11-16  
kaneg 写道

这个蛮误导人的,楼主的意思应该是慢12倍吧

你说的对极了,是慢。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics