java反射效率到底如何,花了点时间,做了一个简单的测试.供大家参考.

测试背景:

1. 测试简单Bean(int,Integer,String)的set方法

2. loop 1亿次

3. 测试代码尽可能避免对象的创建,复发方法的调用,仅仅测试set方法的耗时

测试结果:

场景

本机测试结果(XP,双核,2G)

服务器测试结果(Linux,XEN虚拟机,8核,5.5G)

方法直接调用

235MS

190MS

JDK Method调用

29188MS

4633MS

JDK Method调用(稍作优化)

5672MS

4262MS

Cglib FastMethod调用

5390MS

2787MS

得出一个感性的结果:

1.JDK反射效率是直接调用的一个数量级,差不多20倍

2.一个set方法的反射调用时间= 4633ms / 1亿/ 3次= 0.0154us

3.Cglib的fastmethod还是有优势的

当然反射不止一种方法的,而且也有一些比较常见的优化方式。我们将会测试一下:

直接访问的耗时

直接反射的耗时

缓存需要查找的函数反射的耗时

使用reflectasm的反射耗时

long now;long sum = 0;

TestClass t = new TestClass();

now = System.currentTimeMillis();

for(int i = 0; i<500000; ++i){

t.setNum(i);

sum += t.getNum();

}

System.out.println("get-set耗时"+(System.currentTimeMillis() - now) + "ms秒,和是" +sum);

sum = 0;

now = System.currentTimeMillis();

for(int i = 0; i<500000; ++i){

Class> c = Class.forName("test.TestClass");

Class>[] argsType = new Class[1];

argsType[0] = int.class;

Method m = c.getMethod("setNum", argsType);

m.invoke(t, i);

sum += t.getNum();

}

System.out.println("标准反射耗时"+(System.currentTimeMillis() - now) + "ms,和是" +sum);

sum = 0;

Class> c = Class.forName("test.TestClass");

Class>[] argsType = new Class[1];

argsType[0] = int.class;

Method m = c.getMethod("setNum", argsType);

now = System.currentTimeMillis();

for(int i = 0; i<500000; ++i){

m.invoke(t, i);

sum += t.getNum();

}

System.out.println("缓存反射耗时"+(System.currentTimeMillis() - now) + "ms,和是" +sum);

sum = 0;

MethodAccess ma = MethodAccess.get(TestClass.class);int index = ma.getIndex("setNum");

now = System.currentTimeMillis();

for(int i = 0; i<500000; ++i){

ma.invoke(t, index, i);

sum += t.getNum();

}

System.out.println("reflectasm反射耗时"+(System.currentTimeMillis() - now) + "ms,和是" +sum);

测试结果如下:

get-set耗时6ms秒,和是124999750000

标准反射耗时1838ms,和是124999750000

缓存反射耗时70ms,和是124999750000

reflectasm反射耗时20ms,和是124999750000

可以看出,查找函数依然是耗时最长的部分,JDK7的优化确实很不错,由JDK6的40倍降到10倍左右,reflectasm invoke的效率比java原生invoke好,大致是直接访问的4倍时间。效率确实可以一用。

java反射的性能_java反射的性能问题相关推荐

  1. java 反射为何耗性能_Java反射的性能成本

    在Java中,普遍认为java.reflect API的性能代价很高.旧的Java版本有巨大的性能开销,而新版本似乎使其处于可接受的范围内.但"可接受"到底是什么意思呢? 这是我在 ...

  2. java 提高反射性能_java反射性能

    项目中用到了java的反射,可以大大减少代码量.但是反射的性能却不容乐观,做了个简单的测试,如下. public void noreflect() { Person p = new Person(); ...

  3. java反射源码_java反射技术详解附源码

    在学校学习Java时,由于学的不扎实,也没经历过太多实战项目,所以很多重要的知识点瞟一眼就过去了,比如现在要讲的反射,当时直接就忽略掉了,可现在发现很多地方需要反射,不得不重新学习一下,上学欠了太多债 ...

  4. java反射最佳实践_Java 反射最佳实践 – 码农网

    标签: 概要:最简单优雅的使用反射. 本文的例子都可以在示例代码中看到并下载,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request.本文的示例代码主要 ...

  5. java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)-反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  6. java反射的原理_java反射机制的实现原理

    java反射机制的实现原理 反射机制: 所谓的反射机制就是java语言在运行时拥有一项自观的能力. 通过这种能力可以彻底的了解自身的情况为下一步的动作做准备. 下面具体介绍一下java的反射机制.这里 ...

  7. java和golang性能_Java本质和性能

    java和golang性能 最初的问题是如何计算二进制数中1的个数? 我包含了使用Integer.bitCount()的性能比较,该性能可以转换为固有特性,即单个机器代码指令POPCNT和执行相同功能 ...

  8. java反射 数组类型_Java反射-数组

    通过反射使用数组有时会比较棘手.特别是需要获得一个特定类型数组的Class对象,如int[]等.本文将讨论如何通过反射创建数组和获得他们的Class对象. 注意:本文在阅读Eyal Lupu的博客&q ...

  9. java反射随意值_Java反射总结

    能够分析类能力的程序称为反射.对于给定的Java类名,可以通过反射获取类的信息.将类的各成分映射出相应的Java类. Class类 在程序运行期间,Java运行时系统始终对所有的对象维护一个被称为运行 ...

  10. java反射创建实例_Java反射创建实例

    Java反射创建实例 package com.wkcto.chapter08.demo02; import java.lang.reflect.Constructor; import java.lan ...

最新文章

  1. httpclient开发
  2. 深度学习机器配置 装机指南:从GPU到显示器,全套硬件推荐
  3. Php基础数学运算篇
  4. 记一次院赛CTF的WEB题(入门级别)
  5. 颜色排序(Sort Colors)
  6. 第三天20160728
  7. 在实际使用中 mysql所支持的触发器有_2016计算机二级MySQL冲刺题及答案
  8. python在json文件中查找指定数据_Python中json的取值 如何使用python提取json中指定字段的数据...
  9. python乱码怎么办_python中输出中文乱码怎么解决
  10. 【案例】保健品行业如何优化供应链管理?APS系统来帮忙
  11. 【Java从0到架构师】日志处理 - Log4j 1.x、JCL
  12. vs2015ef链接mysql_【转载】VS2015 + EF6连接MYSQL5.6
  13. PHP内置函数parse_str会自动进行urldecode(URL解码)
  14. 解读Depth Map Prediction from a Single Image using a Multi-Scale Deep Network (7)
  15. 简单的使用一下增强for循环
  16. 【整理】EFI/UEFI BIOS 入门 : All For Beginners
  17. webshell管理之中国菜刀 蚁剑 WeBaCoo Weevely
  18. 在2012年01月20号这一天,2345浏览器的V1.3版本出世了,又修复什么Bug?
  19. 产品经理进阶沙盘演练
  20. 网络的几种分层体系结构

热门文章

  1. 面试官:你说熟悉MySQL,那来谈谈InnoDB怎么解决幻读的?
  2. CentOS 6.2 下samba 服务的配置
  3. ASP MVC 后台控制器弹出框提示
  4. 花了我一个晚上浓缩了一整套阿里资深技术专家设计教程整理出的java架构设计方法
  5. 2019成考计算机几时出成绩,2019年成人高考成绩什么时候出来?如何查询
  6. W1000变频器如何设定频率_变频器参数如何设定,参数故障处理办法
  7. Linux宏定义屏蔽打印信息,宏定义实现调试信息的打印
  8. windows命令_用Windows恢复环境(WinRE)排除电脑故障,只需一条命令
  9. yum clean all之后出错_“之后”英语的4种表达方式?
  10. html语言分行,Markdown内嵌Html语言