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()执行时间:反射查找方法不明显。

猜你喜欢

转载自luckywnj.iteye.com/blog/2301945