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