Java 类反射性能测试及对架构工作的一些思考
通过对比静态调用与类反射调用方法的效率,来了解现代框架中大量应用的反射调用对性能的影响程度。以便在系统架构中对性能与开发便利性之间进行权衡与取舍。
代码1:
/**
*
*/
package test;
import java.lang.reflect.Method;
/**
* @author jetlong
*
*/
public class PerformanceTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
int testTime = 10000000;
PerformanceTest test = new PerformanceTest();
String msg = "this is test message";
long bTime = System.currentTimeMillis();
for(int i=0; i<testTime; i++) {
test.takeAction(msg);
}
long eTime = System.currentTimeMillis();
System.out.println(eTime - bTime);
Method method = test.getClass().getMethod("takeAction", String.class);
bTime = System.currentTimeMillis();
for(int i=0; i<testTime; i++) {
method.invoke(test, msg);
}
eTime = System.currentTimeMillis();
System.out.println(eTime - bTime);
}
public int takeAction(String msg) {
return (msg.length() * (int)(System.currentTimeMillis() % 100000));
}
}
上述方法有缓存方法
在上述1千万次的测试情况下,直接调用与反射调用的相差一倍左右。
764
1516
819
1466
881
1505
其实这种测试结果与测试方法有关,在性能评估中,应评估反射浪费的性能所占的比例,如果是复杂方法,也许这个比例就较低。
如果使用较为简单的调用方法测试(比如单位时钟周期可以完成的操作),则反射所消耗的时间比例是惊人的。
代码2:(不缓存查询到的被调方法)
/**
*
*/
package test;
import java.lang.reflect.Method;
/**
* @author jetlong
*
*/
public class PerformanceTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
int testTime = 10000000;
PerformanceTest test = new PerformanceTest();
String msg = "this is test message";
long bTime = System.currentTimeMillis();
for(int i=0; i<testTime; i++) {
test.takeAction(msg);
}
long eTime = System.currentTimeMillis();
System.out.println(eTime - bTime);
bTime = System.currentTimeMillis();
for(int i=0; i<testTime; i++) {
Method method = test.getClass().getMethod("takeAction", String.class);
method.invoke(test, msg);
}
eTime = System.currentTimeMillis();
System.out.println(eTime - bTime);
}
public int takeAction(String msg) {
return (msg.length() * (int)(System.currentTimeMillis() % 100000));
}
}
测试结果:
930
5369
898
5052
885
5346
889
4992
对比代码1的测试结果,没有缓存被调用方法的情况下,性能损失更为严重。
而考虑在框架级实现中,缓存是通过map等机制进行的,那么在获取缓存时的时间成本也要计算在内,则整体性能对比将在上述两个测试之间。
考虑目前的计算机系统的速度,应用开发已经不在那么介意性能,而更为注重系统的可维护性和扩展性以及快速开发效率上。上述的测试结果是在一千万次的测试基础上产生的。而在通常的一次业务请求中,反射使用的次数应该是非常少的,只在框架级基础上被使用,在一个高负载的系统中,业务处理的性能将是关键点,而不在于使用的这些反射所带来的性能影响上。而使用反射所带来的开发便利与可维护性可扩展性的提升所带来的价值,是远远高于其所损耗的性能的。
又回想起原来在某个所谓高性能项目中通过减少反射来提高性能的做法,现在想来,比较愚蠢。这说明前期的测试工作没有到位,而带来这样的结论偏差,从而导致了开发与维护的不便,而且极大地影响了开发速度。
其实那个系统的大部分性能瓶颈都是在数据库上,大部分的业务处理都是在数据库中进行的,在项目后面的性能测试中发现,WEB服务器的负载非常低,远远低于数据库,大部分的操作都是在等待数据库的返回。
前期某些推论既没有经过验证,也没有相关的使用经验来支持此推论,是导致这种错误的根源。在将来的架构设计工作与框架选型要加强这方面的评估工作,来达到性能与开发效率间的最佳平衡。
分享到:
相关推荐
- **虚拟机原理**:了解JVM的工作机制,包括类加载器、反射机制和垃圾回收等。 - **对象关系映射**:理解对象关系阻抗失配的概念,掌握不同数据库产品的使用方法。 - **安全性**:掌握Java的安全框架如JAAS、JCE等,...
以下是一些在Java面试中经常出现的问题,包括基础、中等和难题,以及一些常见的思考题。 **基础问题:** 1. **Java是什么?** Java是一种跨平台、面向对象的编程语言,由Sun Microsystems(现为Oracle ...
10. **JVM**:理解Java虚拟机的工作原理,包括内存模型、类加载机制、垃圾回收等,有助于优化程序性能。 11. **数据库操作**:SQL基础和JDBC(Java Database Connectivity),如何在Java中连接和操作数据库。 12. ...
Java程序员面试题是一个涵盖广泛领域的主题,从基础语法到高级设计模式,再到系统架构和工程实践,每一个环节都是考察一个开发者综合素质的重要标准。这个"java程序员面试题汇总.7z"压缩包文件显然包含了从初级到...
**Java反射机制**:了解反射的原理及其在开发中的实际应用,如动态加载类、动态调用方法等。 **AOP(面向切面编程)原理**:了解AOP的基本概念、作用及Spring框架中的实现方式。 **Spring原理**:Spring框架的核心...
- Java 8及以后的新特性:如默认方法、Optional类、接口的私有方法和静态方法等。 - 注解(Annotation):了解自定义注解的创建和使用,以及元注解的概念。 4. **JVM** - 类加载机制:理解类的加载、连接、初始...
3. **JVM**:Java虚拟机的工作原理、内存模型(堆、栈、方法区、本地方法栈)、类加载机制(双亲委派模型)、性能调优等方面的知识是必考项。 4. **多线程**:线程的创建方式、同步机制(synchronized、Lock、...
- **反射**:了解反射的基本操作,如创建对象、获取类信息、调用方法等。 - **设计模式**:熟悉常见的设计模式(单例、工厂、观察者、装饰器、代理等)及其应用场景。 3. **Java框架** - **Spring**:理解Ioc/DI...
Java笔试面试题目主要涵盖企业招聘过程中对候选人的技术能力、逻辑思维、问题解决等方面的考察。在准备Java面试时,理解并掌握以下知识点至关重要: 1. **基础语法**:包括类、对象、接口、继承、多态等面向对象...
2. **进阶主题**:仓库可能涵盖JVM(Java虚拟机)内部工作原理、垃圾收集机制、性能调优、反射、注解、模块化系统(如Jigsaw)、并发编程高级技术(如Fork/Join框架和CountDownLatch)等。理解JVM对于优化代码和解决...
27_gRPC双向流式数据通信详解 28_gRPC与Gradle流畅整合及问题解决的完整过程与思考 29_Gradle插件问题解决方案与Nodejs环境搭建 30_通过gRPC实现Java与Nodejs异构平台的RPC调用 31_gRPC在Nodejs领域中的静态代码生成...
8. **反射**:掌握Class类的使用,动态创建对象,修改类属性和调用方法,以及ASM、ByteBuddy等字节码工具。 9. **Spring框架**:理解IoC(控制反转)和AOP(面向切面编程)的概念,Spring Bean的生命周期,以及AOP...
11.2 使用Java的Ajax门户的架构. 11.3 Ajax登录 11.3.1 用户表 11.3.2 服务器端的登录代码:用Java实现 11.3.3 客户端登录框架 11.4 实现DHTML窗口 11.4.1 门户窗口数据库 11.4.2 门户窗口的服务器端代码 11.4.3 ...
- **反射**:在编程语言如Java中,反射机制允许程序在运行时检查和修改自身的行为。 以上创新法则在IT领域的应用丰富多样,无论是产品开发、系统设计还是问题解决,都可以找到它们的身影。理解并熟练运用这些法则...