java反射的性能_java反射的性能问题
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反射的性能问题相关推荐
- java 反射为何耗性能_Java反射的性能成本
在Java中,普遍认为java.reflect API的性能代价很高.旧的Java版本有巨大的性能开销,而新版本似乎使其处于可接受的范围内.但"可接受"到底是什么意思呢? 这是我在 ...
- java 提高反射性能_java反射性能
项目中用到了java的反射,可以大大减少代码量.但是反射的性能却不容乐观,做了个简单的测试,如下. public void noreflect() { Person p = new Person(); ...
- java反射源码_java反射技术详解附源码
在学校学习Java时,由于学的不扎实,也没经历过太多实战项目,所以很多重要的知识点瞟一眼就过去了,比如现在要讲的反射,当时直接就忽略掉了,可现在发现很多地方需要反射,不得不重新学习一下,上学欠了太多债 ...
- java反射最佳实践_Java 反射最佳实践 – 码农网
标签: 概要:最简单优雅的使用反射. 本文的例子都可以在示例代码中看到并下载,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request.本文的示例代码主要 ...
- java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)-反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- java反射的原理_java反射机制的实现原理
java反射机制的实现原理 反射机制: 所谓的反射机制就是java语言在运行时拥有一项自观的能力. 通过这种能力可以彻底的了解自身的情况为下一步的动作做准备. 下面具体介绍一下java的反射机制.这里 ...
- java和golang性能_Java本质和性能
java和golang性能 最初的问题是如何计算二进制数中1的个数? 我包含了使用Integer.bitCount()的性能比较,该性能可以转换为固有特性,即单个机器代码指令POPCNT和执行相同功能 ...
- java反射 数组类型_Java反射-数组
通过反射使用数组有时会比较棘手.特别是需要获得一个特定类型数组的Class对象,如int[]等.本文将讨论如何通过反射创建数组和获得他们的Class对象. 注意:本文在阅读Eyal Lupu的博客&q ...
- java反射随意值_Java反射总结
能够分析类能力的程序称为反射.对于给定的Java类名,可以通过反射获取类的信息.将类的各成分映射出相应的Java类. Class类 在程序运行期间,Java运行时系统始终对所有的对象维护一个被称为运行 ...
- java反射创建实例_Java反射创建实例
Java反射创建实例 package com.wkcto.chapter08.demo02; import java.lang.reflect.Constructor; import java.lan ...
最新文章
- httpclient开发
- 深度学习机器配置 装机指南:从GPU到显示器,全套硬件推荐
- Php基础数学运算篇
- 记一次院赛CTF的WEB题(入门级别)
- 颜色排序(Sort Colors)
- 第三天20160728
- 在实际使用中 mysql所支持的触发器有_2016计算机二级MySQL冲刺题及答案
- python在json文件中查找指定数据_Python中json的取值 如何使用python提取json中指定字段的数据...
- python乱码怎么办_python中输出中文乱码怎么解决
- 【案例】保健品行业如何优化供应链管理?APS系统来帮忙
- 【Java从0到架构师】日志处理 - Log4j 1.x、JCL
- vs2015ef链接mysql_【转载】VS2015 + EF6连接MYSQL5.6
- PHP内置函数parse_str会自动进行urldecode(URL解码)
- 解读Depth Map Prediction from a Single Image using a Multi-Scale Deep Network (7)
- 简单的使用一下增强for循环
- 【整理】EFI/UEFI BIOS 入门 : All For Beginners
- webshell管理之中国菜刀 蚁剑 WeBaCoo Weevely
- 在2012年01月20号这一天,2345浏览器的V1.3版本出世了,又修复什么Bug?
- 产品经理进阶沙盘演练
- 网络的几种分层体系结构
热门文章
- 面试官:你说熟悉MySQL,那来谈谈InnoDB怎么解决幻读的?
- CentOS 6.2 下samba 服务的配置
- ASP MVC 后台控制器弹出框提示
- 花了我一个晚上浓缩了一整套阿里资深技术专家设计教程整理出的java架构设计方法
- 2019成考计算机几时出成绩,2019年成人高考成绩什么时候出来?如何查询
- W1000变频器如何设定频率_变频器参数如何设定,参数故障处理办法
- Linux宏定义屏蔽打印信息,宏定义实现调试信息的打印
- windows命令_用Windows恢复环境(WinRE)排除电脑故障,只需一条命令
- yum clean all之后出错_“之后”英语的4种表达方式?
- html语言分行,Markdown内嵌Html语言