`

JDK8--JDK6反射性能测试

 
阅读更多

1,jdk8下的测试结果:

java.version=1.8.0_91

t1.time=9

t2.time=29

t3.time=2330

t4.time=48287(执行次数为loopCnt/10)

 

问题1,t1()比t2()多new了1G-1次的对象,为什么比t2还快?

结论1,jdk8下,t3()反射执行方法,比t2()直接调用慢100倍。不过cpu这么快仍然可以接受。但是为什么呢。

还需要转换什么?

结论2,jdk8下,t4()反射寻找方法,更慢,大约是10000倍。原因是查找方法,名称参数都需要字符串比较,JVM应该不会为此建立索引。

import java.lang.reflect.Method;

public class Test {
	private static final int loopCnt = 1000 * 1000 * 1000;
	public static void main(String[] args) throws Exception {
		System.out.println("java.version="+System.getProperty("java.version"));
		t1();
		t2();
		t3();
	}
	
	//每次重新生成对象
	public static void t1(){
		long s = System.currentTimeMillis();
		for (int i = 0; i < loopCnt; i++) {
			Person p = new Person();
			p.setAge(31);
		}
		long e = System.currentTimeMillis();
		System.out.println("t1.time="+(e-s));
	}
	
	//同一个对象
	public static void t2(){
		long s = System.currentTimeMillis();
		Person p = new Person();
		for (int i = 0; i < loopCnt; i++) {
			p.setAge(32);
		}
		long e = System.currentTimeMillis();
		System.out.println("t2.time="+(e-s));
	}
	
	public static void t3() throws Exception{
		long s = System.currentTimeMillis();
		Class<Person> c = Person.class;
		Person p = c.newInstance();
		Method m = c.getMethod("setAge", Integer.class);
		for (int i = 0; i < loopCnt; i++) {
			m.invoke(p, 33);
		}
		long e = System.currentTimeMillis();
		System.out.println("t3.time="+(e-s));
	}
	
	static class Person{
		private int age = 20;
		public int getAge() {
			return age;
		}
		public void setAge(Integer age) {
			this.age = age;
		}
	}
}

 

切到JDK6测试:

loopCnt 除以10,loopCnt = 1000 * 1000 * 100; 其他不变

结果

java.version=1.6.0_43

t1.time=56

t2.time=38

t3.time=18659

t4.time=4598(执行次数为loopCnt/10)

乘以10后估计值。

java.version=1.6.0_43

t1.time=560

t2.time=380

t3.time=186590

t4.time=45980(执行次数为loopCnt/10)

JDK8的结果:

java.version=1.8.0_91

t1.time=9

t2.time=29

t3.time=2330

t4.time=48287(执行次数为loopCnt/10)

 

问题2,普通方法jdk8为何比jdk6快这么多。是因为循环代码,JIT的优化的好吗?

结论3,比较t3()执行时间:反射执行方法jdk8优化了好多。比较t4()执行时间:反射查找方法不明显。

 

分享到:
评论

相关推荐

    jdk-8u202-linux-arm64-vfp-hflt-demos.tar.gz

    在解压"jdk-8u202-linux-arm64-vfp-hflt-demos.tar.gz"后,用户可以探索和学习JDK 8的示例代码,这些示例涵盖了Java语言的关键特性和API,如多线程、I/O操作、网络编程、集合框架、反射、注解、泛型等。通过研究这些...

    jdk-8u131-linux-x64.rpm.rar

    Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的核心组件,它包含了编译器、运行环境以及各种工具,使得开发者可以编写、测试和运行Java应用程序。JDK的版本更新频繁,旨在修复已知问题,提高性能...

    jdk-8u211-windows-x64.exe

    6. **新反射API**:新反射API提供了对模块、类型参数和默认方法的支持,使开发者在运行时能够更好地理解和操作程序的元数据。 7. **并发改进**:并行和并发编程得到优化,例如Fork/Join框架和Parallel Streams的...

    jdk-8u201-linux-x64.tar.gz.zip

    JDK 8u201是一个维护更新版本,主要修复了安全漏洞,提高了性能,并包含了一些小的改进。这些更新对于保持系统安全和稳定至关重要,因为Java应用程序通常会处理敏感数据或运行在关键环境中。 **Linux下的安装步骤:...

    JDK8-windows-64

    JDK是Java编程语言的核心工具集,包含了编译器、调试器、文档生成器以及其他必要的工具,使得开发者能够编写、测试和运行Java应用程序。 在描述“JDK8-windows-64;”中,重点在于这个版本的JDK是为64位Windows系统...

    jdk-8u201-windows-x64.zip

    4. **方法引用来替代反射**:JDK 8引入了方法引用,这是一种更简洁的语法,可以将方法的引用传递给其他需要方法对象的地方,减少了对反射的依赖。 5. **默认方法**:接口在JDK 8中得到了增强,允许定义具有实现的...

    jdk11全版本 java11 jdk-11windows-x64_bin.exe.zip

    8. **改进的JShell(REPL)**:Java 11的JShell工具提供了更好的错误报告和改进的控制台体验,便于开发者进行快速的代码测试和调试。 9. **双括号初始化语法的警告**:虽然Java 11并未禁止双括号初始化,但会发出...

    Windowns系统Java8下载jdk8u202-win64.zip

    JDK 8u202是Java 8的更新版本,包含了安全修复、性能优化和稳定性改进。对于商业用途,8u202是一个重要的里程碑,因为它标志着Oracle提供的免费商用支持的结束。在2019年之后,Oracle开始对Java SE的商业使用收取...

    JDK6-7-8压缩包解压可用

    总结来说,这个"JDK6-7-8压缩包解压可用"提供了Java开发历史上三个关键版本的JDK,它们各自具有独特的特性和功能,满足了开发者对不同版本Java环境的需求,对于学习、测试和开发工作具有极高的实用价值。

    jdk-6u41-windows-x64.exe文件.zip

    下载的“jdk-6u41-windows-x64.exe”文件是JDK6 64位版的安装程序。安装过程包括: 1. 双击执行安装程序,按照提示完成安装。 2. 配置环境变量,包括`JAVA_HOME`指向JDK的安装路径,`PATH`中添加`%JAVA_HOME%\bin`,...

    jdk-8u152-docs-all.rar

    JDK 8u152文档详细解析了Java虚拟机(JVM)的工作原理,包括类加载机制、垃圾收集器、内存模型以及性能调优策略。理解这些内容对于优化程序性能、解决内存泄漏等问题至关重要。 四、JavaFX 作为Java的图形用户界面...

    jdk-8u101-windows-x64.rar

    8. **Java标准版API**:JDK包含了Java SE(标准版)的全套API,包括核心类库,如集合框架、I/O流、网络编程、多线程、反射等。 9. **Java字库识别(OCR)**:描述中提到OCR字库识别,这可能是指在某些Java应用中,...

    jdk-14.0.1_windows-x64_bin.zip

    6. **开发者工具**:包括JConsole、JVisualVM等,用于监视和分析Java应用的性能,以及内存使用情况。 7. **Java标准版API**:提供了一系列的类库,如集合框架、I/O流、网络编程、多线程、反射等,为开发者提供了...

    jdk-9_doc-api-google.zip

    10. **JShell(REPL)**:JShell是JDK 9引入的新特性,它是一个交互式命令行工具,允许开发者即时测试Java代码,加快了学习和调试的速度。 总的来说,"jdk-9_doc-api-google.CHM"文档为Java开发者提供了详尽的JDK 9...

    离线JDK9中文版 | API_jdk-9.CHM

    Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的标准开发环境,它包含了编译、运行Java程序所需的各种工具和库。这个离线JDK9中文版的API文档,即`API_jdk-9.CHM`,是开发者在没有网络连接时查阅...

    jdk-8u221-windows-i586 32位

    JDK 8u221的JVM进行了优化,提高了性能并修复了安全漏洞。 3. **Java Runtime Environment (JRE)**:虽然JRE不是JDK的一部分,但它是运行Java应用程序所必需的。JDK包含了JRE,使得开发者可以测试他们的程序。 4. ...

    linux系统用jdk-6u45-linux-x64-rpm 64位

    这里我们关注的是版本为`jdk-6u45-linux-x64-rpm`,这是一个针对64位Linux操作系统的RPM包。RPM(Red Hat Package Manager)是一种软件包管理器,广泛用于Fedora、CentOS、Red Hat Enterprise Linux等基于Linux的...

    jdk1.6-64位免安装

    JDK1.6,也称为Java SE 6,是Java平台的一个重要版本,它包含Java编译器、Java运行时环境(JRE)、调试器、文档以及各种API。这个“jdk1.6-64位免安装”压缩包文件显然是针对64位操作系统的,无需安装即可使用的JDK...

    jdk-12.0.2_windows-x64_bin

    6. **JVM常量API (JEP 328)**:提供了对JVM常量的访问,包括类型、方法和字段的符号引用,方便了反射和动态代码生成。 在压缩包文件名称列表中,只有一个条目“jdk-12.0.2_windows-x64_bin”,这意味着压缩包包含的...

    jdk-8u181-windows-x64+eclipse

    这个版本的JDK包含了Java编译器(javac)、Java虚拟机(JVM)、Java运行时环境(JRE)以及各种开发者工具,如Java文档生成器(javadoc)、性能分析器(jmap)等。 Java SE(Java Standard Edition)是Java平台的一...

Global site tag (gtag.js) - Google Analytics