- 浏览: 162725 次
- 性别:
- 来自: 北京
最新评论
-
tanliwei:
Mr-su 写道行业(xingye),why?行是个多音字。
...
利用Java开源库把汉字转拼音 -
u148:
java.io.IOException: Stream clo ...
自己封装的一个编码转换工具类 -
Mr-su:
行业(xingye),why?
利用Java开源库把汉字转拼音 -
364902709:
<div class="quote_title ...
测试Java反射效率 -
此意悠悠:
不可能的,java反射刚出来,最差的时候是正常编程的10倍时间 ...
测试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
评论
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,然后再循环。
//
//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,然后再循环。
//
//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
非常有用。谢谢
发表评论
-
管中窥豹,结合多线程,对于tomcat中servlet加载的一点试探
2010-05-18 23:58 3156对于Servlet自己的生命周 ... -
传一本书里的代码
2010-04-13 22:24 1354RT 我把编译产生的bin删了,小了很多 -
想想我們大學都教了啥, 差距呀
2010-03-27 01:02 1108昨天还发现了一个新的概念,叫OAuth,OpenSSO ... -
我也說說OpenSSO
2010-03-24 22:24 1499昨天看到Oracle要關閉OpenSSO的消息,還說要 ... -
考慮用g4j實現一個gmail客戶端
2010-03-20 20:37 1030公司考慮信息安全,所以圖允許我們在公司里使用gmail ... -
Gmailer api for java
2010-03-19 16:43 1019今天研究了一下子g4j,這個東西,沒弄完,因為公司里面不能隨便 ... -
网站莫名其妙老是挂,原来是线程数太小
2009-11-04 07:54 3285昨天下午我们那个网站忽然变得很慢,我登上去看了下,没发现什么异 ... -
我设计的权限管理方案
2009-06-15 00:34 1845这是给我们学校的某管 ... -
自己做的简单的web服务器
2009-06-14 20:39 2427我最近修的电子商务概论的课程,老师布置的作业,是要做个简单的w ... -
(两年前初学JAVA时写过的一篇文章,发现给我们班同学看还挺有用的)
2009-06-04 04:02 1236最近装了 fedora 7感觉满好,虽然许多人都推崇ubunt ... -
记两次服务器不能启动大原因
2009-05-25 22:44 1141遇到这种很诡异的情况,tomcat无缘无故不能启动,一直处于s ... -
利用Java开源库把汉字转拼音
2009-05-21 02:52 35310最近做的项目,因为下拉框中的项目太多,需要有个过滤的方法。我想 ... -
java 预申请磁盘空间处理大文件
2009-05-09 03:40 1586熟悉电驴和bt的你可能经常看到这些软件可以在下载文件之初就先在 ... -
自己封装的一个编码转换工具类
2009-05-01 23:34 2044java做编码转换有两中方法 1.基于流的编码转换 I ... -
http parser 基本用法
2009-04-24 22:40 8056手动解析HTML是一件很崩溃的事情,sun的swing里也有解 ... -
用httpclient模仿firefox发送http请求
2009-04-10 12:18 7163最近需要做爬虫,研究了一下进行做http客户端的东 ... -
在Java中实现伪静态页面
2009-02-18 14:58 3499在Java中做这个事情好像有很多中方案,比较简单的方法是使用U ... -
关于Hibernate懒加载问题的最终解决方案
2009-02-18 14:40 12486Hibernate的强大之处之一是懒加载功能,可以有效的降低数 ...
相关推荐
本文将深入探讨Java反射的效率问题,以及何时、如何谨慎使用反射以优化性能。 首先,理解反射的工作原理至关重要。当Java程序使用反射时,它不再依赖于编译时的静态类型信息,而是动态地获取和调用类的方法,访问...
### JAVA-提高反射效率 #### 一、反射技术概述 反射是Java中一项强大的功能,它允许程序在运行时检查类、接口、字段和方法的信息,并且可以动态地调用方法或修改字段值。这种能力使得Java程序具有高度的灵活性和可...
### Java反射机制详解 ...尽管存在一定的性能和安全性上的问题,但在合理设计和使用的情况下,Java反射机制可以极大地提高软件的开发效率和维护性。开发者在使用反射时应当权衡其利弊,谨慎选择应用场景。
文件`testReflect`可能是用于测试这些反射优化技术的源代码,通过阅读和分析这个文件,我们可以更深入地理解这些概念是如何在实践中应用的。如果你需要进一步的帮助来解析或理解这个文件,欢迎提供更多的信息。
《Java反射性能测试分析》 Java反射机制是Java语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并调用其方法,极大地增强了代码的灵活性和可扩展性。然而,反射在带来便利的同时,也因其相对较低的性能...
Java 反射效率优化方法 Java 反射是 Java 语言中的一种机制,允许程序在运行时检查和修改自身的行为。然而,使用 Java 反射时,很多开发者都会遇到性能问题。下面我们将讨论如何提高使用 Java 反射的效率。 反射的...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理现实业务问题时尤其有用,例如实现插件化、元编程、动态代理等...
【Java反射性能测试分析】 Java反射机制是Java语言的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等元数据。反射提供了动态类型的能力,使得程序能够在运行时创建和操作对象,这在框架设计、...
在自动化测试中,利用Java反射可以动态加载测试类,调用测试方法,极大地增强了测试框架的灵活性和通用性。 - 模块化设计:将测试框架拆分为独立的模块,使得框架的各个部分可以独立开发、测试和维护,有助于降低...
Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了编译时的束缚,使得代码具有更高的灵活性和可扩展性。在Java中,反射主要依赖于`...
在移动应用开发中,自动化测试是确保产品质量和稳定性的关键环节。本文将深入探讨一个基于Java反射技术构建的APP自动化...总之,理解和利用Java反射在自动化测试中的作用,对于提升软件工程的效率和质量具有重要意义。
Java自定义注解是Java语言中的一个重要特性,它允许我们创建自己的元数据,为代码提供额外的信息。在Java中,注解(Annotation)主要用于编译器检查...理解并熟练运用自定义注解和反射,能够显著提升代码的质量和效率。
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、对象等的内部信息。这个"Java反射机制视频教程"可能是为了帮助开发者深入理解这一概念,尽管描述中提到视频质量可能不尽如人意...
JAVA反射知识总结涉及到的主要知识点包括: 1. 反射的基本概念: 反射是Java语言中的一个特性,允许程序在运行期间动态地访问和操作类、方法、成员变量等组件。通过反射,可以突破访问控制,动态创建对象,调用方法...
Java反射在实际工作中的应用笔记 Java反射是Java语言中一个非常重要的特性,它可以在实际工作中发挥着...Java反射在实际工作中的应用非常广泛,通过使用Java反射,我们可以更好地解决实际问题,提高编程效率和灵活性。
下面我们将深入探讨Java反射的核心知识点。 1. **Chp16** - 可能指的是某个教程或书籍中的第16章,专门讲解反射。在Java中,反射通常被视为高级主题,涉及JVM(Java虚拟机)和元数据的交互。通过Java.lang.Class类...
Java反射工具类ReflectionUtils是Java开发中常用的一个辅助类,它可以帮助开发者在运行时检查类、接口、字段和方法的信息,以及动态调用方法和访问字段。反射在Java编程中扮演着重要的角色,特别是在框架开发、插件...
Java反射是Java编程语言中的一个强大特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在深入理解Java反射的应用之前,我们首先需要知道什么是反射以及它的基本概念。 Java...