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倍时间。效率确实可以一用。

原文地址:https://www.cnblogs.com/shoshana-kong/p/10571990.html

时间: 2024-11-03 08:23:13

java反射的性能问题的相关文章

java反射机制性能优化

import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; public class DynamicServer { private static Logger log = Logger.getLogger(DynamicServ

java反射性能与优化

在最近的计划中,打算看看在不使用google protobuf的情况下,在原有的采用jackson作为json序列化工具的基础上,是否可以实现进一步的性能优化.主要是针对list的情况. 测试的时候选择了一个50个字段的对象,采用50条记录的list作为例子.因为大部分还都是可控的系统rpc交互,所以测试的时候选择了将字段用逗号分隔的方式. 在反射机制中,Reflection和BeanInfo两种均作了测试,method/field都做了缓存的前提,结果中与原生jackson序列化.反序列化性能

JAVA反射会降低你的程序性能吗?

原文出处 早两天写了<从把三千行代码重构成15行代码谈起>这篇文章,看到评论中有一些同学的回复还是在质疑反射的性能,好像程序用上了反射,就像开上了拖拉机似的.本来我觉得这个话题没有什么好讨论的了,网上已经有太多太多的文章在说这个问题,有疑问的大可以到网上找相关的文章来查阅.但是,我想起来我刚编程的时候,也是遇到这种困惑到网上一查找,从各种角度阐述的都有,本质基本都说出来了,但是还是有很多人不理解,我这里就从我的角度再说一遍. 反射肯定比直接调用慢 这个毋庸置疑了,我这篇文章也不是证明反射有多高

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

Java反射-再次认识

最近的学习发现在很多方面,基础知识掌握的还很不牢固,所以对于架构.知识点等属于那种问啥啥知道,做啥啥不出来的那种类型.前些日子,老师一直在抓基础,做什么都要从最简单的demo开始,只有懂了原理之后再去用一些高深的东西如框架等才会理解的更深刻.现在首先需要理解的就是基本上每个Java框架都在用的反射技术. 要想理解反射,首先得了解类的加载过程,看下图: 我们的源代码经过编译之后变成字节码,然后在JVM中运行时通过类加载器加载字节码在内存中生成Class类对象,这个Class类对象内包含有field

java反射field和method的顺序问题

最近在有思考到序列化性能优化的问题,关于java反射field和method的顺序问题,这里有详细的讨论http://stackoverflow.com/questions/5001172/java-reflection-getting-fields-and-methods-in-declaration-order javadoc不保证顺序,所以最好的方式仍然是通过自定义注解处理器实现,比如典型的可以借用jackson 的ordered注解JsonPropertyOrder或者objectMap

Java反射机制专题

·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法 ·Java反射机制提供的功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任何一个对象的成员变量和方法 生成动态代理 ·反射相关的主要API: java.lang.Class:代表一个类 java.lang.refle

java反射的理解与应用(某大神博客中看到的博文,写的真的太好了,果断转载作为笔记)

原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html#undefined 一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码, Class.forName("com.mysql.jdbc.Driver.cl