`
tuoxie007
  • 浏览: 162807 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

测试Java反射效率

    博客分类:
  • Java
阅读更多

测试分为3个方面:1. 实例化效率;2. 方法调用效率;3. 成员变量GET调用效率;4. 成员变量SET调用

测试环境:

Windows 7

Sun Java 1.6

 

先写好备测试用的类

import java.util.Date;


public class DemoClass{
	public String firstName;
	private String endName;
	private Date birthDay;
	private String email;
	private String phone;
	private DemoClass parent;
	
	public String getFirstName() {
    	return firstName;
    }
	public void setFirstName(String firstName) {
    	this.firstName = firstName;
    }
	public String getEndName() {
    	return endName;
    }
	public void setEndName(String endName) {
    	this.endName = endName;
    }
	public Date getBirthDay() {
    	return birthDay;
    }
	public void setBirthDay(Date birthDay) {
    	this.birthDay = birthDay;
    }
	public String getEmail() {
    	return email;
    }
	public void setEmail(String email) {
    	this.email = email;
    }
	public String getPhone() {
    	return phone;
    }
	public void setPhone(String phone) {
    	this.phone = phone;
    }
	public DemoClass getParent() {
    	return parent;
    }
	public void setParent(DemoClass parent) {
    	this.parent = parent;
    }
}
 

 

1. 实例化效率

1) 正常调用

public class TestReflectNew {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
//	    	DemoClass.class.newInstance();
	    	new DemoClass();
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

三次输出:

18 MillSeconds

19 MillSeconds

20 MillSeconds

均值:19

 

2) 反射调用

public class TestReflectNew {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
	    	DemoClass.class.newInstance();
//	    	new DemoClass();
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

191 MillSeconds

193 MillSeconds
192 MillSeconds

均值:192

 

2. 方法调用测试

1) 正常调用

public class TestReflectMethod {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
//	    	DemoClass.class.getMethod("getBirthDay").invoke(dc);
	    	dc.getBirthDay();
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

2 MillSeconds

2 MillSeconds

2 MillSeconds

均值:2

2) 反射调用

public class TestReflectMethod {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
	    	DemoClass.class.getMethod("getBirthDay").invoke(dc);
//	    	dc.getBirthDay();
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

1223 MillSeconds

1201 MillSeconds

1207 MillSeconds

均值1210

 

3. 测试成员变量GET

1) 正常调用

public class TestReflectFieldGet {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    String s;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
//	    	s = (String) DemoClass.class.getField("firstName").get(dc);
	    	s = dc.firstName;
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

2 MillSeconds

1 MillSeconds

3 MillSeconds

均值:2

 

2) 反射调用

public class TestReflectFieldGet {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    String s;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
	    	s = (String) DemoClass.class.getField("firstName").get(dc);
//	    	s = dc.firstName;
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

992 MillSeconds

1000 MillSeconds

1005 MillSeconds

均值:999

 

4. 测试成员变量SET

1) 正常调用

public class TestReflectFieldSet {

	public static void main(String[] args) throws Exception {
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    String s = null;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
	    	dc.firstName = s;
//	    	DemoClass.class.getField("firstName").set(dc, s);
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

1 MillSeconds

2 MillSeconds

2 MillSeconds

均值:1.7

2) 反射调用

public class TestReflectFieldSet {

	public static void main(String[] args) throws Exception {
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    String s = null;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
//	    	dc.firstName = s;
	    	DemoClass.class.getField("firstName").set(dc, s);
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
} 

三次输出:

998 MillSeconds

1021 MillSeconds

1007 MillSeconds

均值:1009

 

来个统计

反射平均时间 非反射平均时间 比值
实例化 192 19 10
方法调用 1210 2 605
成员Get 999 2 500
成员Set 1009 1.7 593

 

 

以上测试的方式如果有不合理的地方请eye友们指点,看看测试的方法是否得当,是否全面

 

本人新博客:tuoxie.me

3
1
分享到:
评论
8 楼 364902709 2013-04-15  
此意悠悠 写道
不可能的,java反射刚出来,最差的时候是正常编程的10倍时间。现在渐渐优化,已经是正常编程的3倍时间了。。为何楼主测试结果都是几百倍??

这个你做过测试么,我这边在JDK1.6上还是差很多。
7 楼 此意悠悠 2012-07-24  
不可能的,java反射刚出来,最差的时候是正常编程的10倍时间。现在渐渐优化,已经是正常编程的3倍时间了。。为何楼主测试结果都是几百倍??
6 楼 sotier 2012-05-22  
现在来说java企业应用的服务器硬件条件都非常猛,如果项目中不是大规模使用反射,反射的效率问题是不是也不算个啥?
5 楼 harbey 2011-11-24  
如果反射效率比直接调用要低,如何解决呢?
4 楼 damoqiongqiu 2011-07-22  
按照这个测试结果,大规模使用反射就是个杯具啊!!!
有木有啊!!!
求楼主回答啊!!!
3 楼 tuoxie007 2010-07-19  
xwhoyeah 写道
//2) 反射调用
//
//9.        while(i<1000000){  
//10.            i++;  
//11.//          dc.firstName = s;  
//12.            DemoClass.class.getField("firstName").set(dc, s);  
//13.        }

此处的 Field 的取得不妥,应先先取得Field,然后再循环。

我就是要测试getField的效率如何
2 楼 xwhoyeah 2010-07-19  
//2) 反射调用
//
//9.        while(i<1000000){  
//10.            i++;  
//11.//          dc.firstName = s;  
//12.            DemoClass.class.getField("firstName").set(dc, s);  
//13.        }

此处的 Field 的取得不妥,应先先取得Field,然后再循环。
1 楼 huangmou37 2010-07-15  
非常有用。谢谢

相关推荐

    java反射效率

    本文将深入探讨Java反射的效率问题,以及何时、如何谨慎使用反射以优化性能。 首先,理解反射的工作原理至关重要。当Java程序使用反射时,它不再依赖于编译时的静态类型信息,而是动态地获取和调用类的方法,访问...

    JAVA-提高反射效率

    ### JAVA-提高反射效率 #### 一、反射技术概述 反射是Java中一项强大的功能,它允许程序在运行时检查类、接口、字段和方法的信息,并且可以动态地调用方法或修改字段值。这种能力使得Java程序具有高度的灵活性和可...

    Java反射机制 Java反射机制

    ### Java反射机制详解 ...尽管存在一定的性能和安全性上的问题,但在合理设计和使用的情况下,Java反射机制可以极大地提高软件的开发效率和维护性。开发者在使用反射时应当权衡其利弊,谨慎选择应用场景。

    java之反射优化(缓存思路)源码

    文件`testReflect`可能是用于测试这些反射优化技术的源代码,通过阅读和分析这个文件,我们可以更深入地理解这些概念是如何在实践中应用的。如果你需要进一步的帮助来解析或理解这个文件,欢迎提供更多的信息。

    java反射性能测试分析.pdf

    《Java反射性能测试分析》 Java反射机制是Java语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并调用其方法,极大地增强了代码的灵活性和可扩展性。然而,反射在带来便利的同时,也因其相对较低的性能...

    详解提高使用Java反射的效率方法

    Java 反射效率优化方法 Java 反射是 Java 语言中的一种机制,允许程序在运行时检查和修改自身的行为。然而,使用 Java 反射时,很多开发者都会遇到性能问题。下面我们将讨论如何提高使用 Java 反射的效率。 反射的...

    java反射Demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理现实业务问题时尤其有用,例如实现插件化、元编程、动态代理等...

    java反射性能测试分析.doc

    【Java反射性能测试分析】 Java反射机制是Java语言的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等元数据。反射提供了动态类型的能力,使得程序能够在运行时创建和操作对象,这在框架设计、...

    基于Java反射的APP自动化混合测试框架的研究与实现.pdf

    在自动化测试中,利用Java反射可以动态加载测试类,调用测试方法,极大地增强了测试框架的灵活性和通用性。 - 模块化设计:将测试框架拆分为独立的模块,使得框架的各个部分可以独立开发、测试和维护,有助于降低...

    Java 反射机制浅析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了编译时的束缚,使得代码具有更高的灵活性和可扩展性。在Java中,反射主要依赖于`...

    基于Java反射的APP自动化混合测试框架的研究与实现.zip

    在移动应用开发中,自动化测试是确保产品质量和稳定性的关键环节。本文将深入探讨一个基于Java反射技术构建的APP自动化...总之,理解和利用Java反射在自动化测试中的作用,对于提升软件工程的效率和质量具有重要意义。

    Java自定义注解使用反射获取字段注解

    Java自定义注解是Java语言中的一个重要特性,它允许我们创建自己的元数据,为代码提供额外的信息。在Java中,注解(Annotation)主要用于编译器检查...理解并熟练运用自定义注解和反射,能够显著提升代码的质量和效率。

    Java反射机制视频教程

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、对象等的内部信息。这个"Java反射机制视频教程"可能是为了帮助开发者深入理解这一概念,尽管描述中提到视频质量可能不尽如人意...

    JAVA反射知识总结

    JAVA反射知识总结涉及到的主要知识点包括: 1. 反射的基本概念: 反射是Java语言中的一个特性,允许程序在运行期间动态地访问和操作类、方法、成员变量等组件。通过反射,可以突破访问控制,动态创建对象,调用方法...

    Java反射在实际工作中的应用笔记

    Java反射在实际工作中的应用笔记 Java反射是Java语言中一个非常重要的特性,它可以在实际工作中发挥着...Java反射在实际工作中的应用非常广泛,通过使用Java反射,我们可以更好地解决实际问题,提高编程效率和灵活性。

    java中反射知识总结

    下面我们将深入探讨Java反射的核心知识点。 1. **Chp16** - 可能指的是某个教程或书籍中的第16章,专门讲解反射。在Java中,反射通常被视为高级主题,涉及JVM(Java虚拟机)和元数据的交互。通过Java.lang.Class类...

    java反射工具类 ReflectionUtils

    Java反射工具类ReflectionUtils是Java开发中常用的一个辅助类,它可以帮助开发者在运行时检查类、接口、字段和方法的信息,以及动态调用方法和访问字段。反射在Java编程中扮演着重要的角色,特别是在框架开发、插件...

    java反射应用详细介绍.rar

    Java反射是Java编程语言中的一个强大特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在深入理解Java反射的应用之前,我们首先需要知道什么是反射以及它的基本概念。 Java...

Global site tag (gtag.js) - Google Analytics