反射调用的性能对比

反射虽然强大,但存在性能的不足,使用反射基本上是一种解释操作,您可以告诉JVM您希望做什么并且它满足您的要求。曾经看过一本书举例说调用同一个方法,使用反射来动态实现比直接在源代码中编写的方式大概慢一到两个数量级。或许方法比较快些,但经过测试发现字段更慢。

测试Demo如下:

 
  1. package net.oseye;
  2. import java.lang.reflect.Field;
  3.  
  4. public class ReflectTest {
  5. //直接调用
  6. public static int numAdd(int loops){
  7. int val=0;
  8. long startTime=0;
  9. for(int i=0;i<loops;i++){
  10. if(i==0){startTime=System.nanoTime();}
  11. val+=i;
  12. }
  13. long totalTime=System.nanoTime()-startTime;
  14. System.out.println("直接调用总的纳秒时间:\t\t"+totalTime);
  15. return val;
  16. }
  17. //引用调用字段
  18. public static int numAddReference(int loops){
  19. User user=new User();
  20. long startTime=0;
  21. for(int i=0;i<loops;i++){
  22. if(i==0){startTime=System.nanoTime();}
  23. user.num+=i;
  24. }
  25. long totalTime=System.nanoTime()-startTime;
  26. System.out.println("引用调用字段总的纳秒时间:\t"+totalTime);
  27. return user.num;
  28. }
  29. //反射调用字段
  30. public static int numAddReflection(int loops) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
  31. User user=new User();
  32. long startTime=0;
  33. for(int i=0;i<loops;i++){
  34. if(i==0){startTime=System.nanoTime();}
  35. Class<?> cUser=user.getClass();
  36. Field field=cUser.getField("num");
  37. field.set(user, field.getInt(user)+i);
  38. }
  39. long totalTime=System.nanoTime()-startTime;
  40. System.out.println("反射调用字段总的纳秒时间:\t"+totalTime);
  41. return user.num;
  42. }
  43. public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
  44. int loops=1000000;
  45. numAdd(loops);
  46. numAddReference(loops);
  47. numAddReflection(loops);
  48. }
  49. }
  50. class User{
  51. public int num;
  52. }

输出:

 
  1. 直接调用总的纳秒时间: 4784726
  2. 引用调用字段总的纳秒时间: 26341772
  3. 反射调用字段总的纳秒时间: 2707670627

测试100万次,除掉第一次的时间,可以看出反射用的时间是引用的100倍,是直接调用的500多倍。当然根据测试的次数不同,机器的配置不同,结果稍有不同

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hhb200766

菩提本无树

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值