Java中反射性能测试
来源:互联网 发布:linux修改系统日期 编辑:程序博客网 时间:2024/04/30 06:31
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 = newClass[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秒
标准反射耗时1838ms
缓存反射耗时70ms
reflectasm反射耗时20ms
可以看出查找函数依然是耗时最长的部分,JDK7的优化确实很不错,由JDK6的40倍降到10倍左右,reflectasm invoke的效率比java原生invoke好,大致是直接访问的4倍时间。效率确实可以一用。
原帖地址:http://www.cnblogs.com/zhishan/p/3195771.html
- Java中反射性能测试
- Java中反射性能测试
- JAVA反射性能测试
- JAVA反射性能测试
- java反射性能测试
- java反射性能测试分析
- java反射性能测试分析
- java反射性能测试分析
- java的反射性能测试
- 小测试C#中反射的性能
- JAVA反射性能测试和应用场景
- java反射机制的性能问题,对比测试!
- MethodHandle VS Method, Java反射及MethodHandle性能测试
- java 反射性能
- JAVA中String替换性能简单测试
- java中ArrayList与LinkedList性能测试
- java 中for循环的性能测试
- 测试Java反射效率
- 二分搜索:lower_bound, upper_bound
- jaxb Element下怎么设置多个同名的子Element
- 笔记10--遇到的错误
- 海力士camera
- POJ 1001 & UVa 748 - Exponentiation in JAVA
- Java中反射性能测试
- Spring + iBatis 的多库横向切分简易解决思路
- 守护进程
- Andriod 存储数据方式 之 SharedPreferences
- 23种设计模式之python实现--代理(Proxy)模式
- Linux环境下使用vsftpd搭建ftpd服务器
- Windows免费:微软移动最后的探戈
- php框架之yii(一)
- 实例二:Ajax返回Json在Java中的实现