以下代码测量了调用接口Handler中方法handle(Object o)100次所需的时间(是低质量的性能分析):
事实上,如果LinkedList仅包含一种Handler类型,例如SuperHandler,执行时间比包含2个、3个等不同类型的Handler要短。每次我将一个新类型的Handler添加到列表中,性能都会降低。
例如,当我仅更改此部分时,性能比上面的更好:
package test;
import java.util.LinkedList;
public class Test {
static int i = 0;
private interface Handler {
public void handle(Object o);
}
private static class SuperHandler implements Handler {
public void handle(Object o) { i += 1; }
}
private static class NoSuperHandler implements Handler {
public void handle(Object o) { i += 1; }
}
private static class LulSuperHandler implements Handler {
public void handle(Object o) { i += 1; }
}
private static class LilSuperHandler implements Handler {
public void handle(Object o) { i += 1; }
}
private static class LolSuperHandler implements Handler {
public void handle(Object o) { i += 1; }
}
private static class LalSuperHandler implements Handler {
public void handle(Object o) { i += 1; }
}
private static class LylSuperHandler implements Handler {
public void handle(Object o) { i += 1; }
}
private static class LzlSuperHandler implements Handler {
public void handle(Object o) { i += 1; }
}
public static void main(String[] args) {
LinkedList<Handler> ll = new LinkedList<Handler>();
for(int j = 0; j < 100; j++) {
if((j % 8) == 0) ll.add(new SuperHandler());
if((j % 8) == 1) ll.add(new NoSuperHandler());
if((j % 8) == 2) ll.add(new LulSuperHandler());
if((j % 8) == 3) ll.add(new LilSuperHandler());
if((j % 8) == 4) ll.add(new LolSuperHandler());
if((j % 8) == 5) ll.add(new LalSuperHandler());
if((j % 8) == 6) ll.add(new LylSuperHandler());
if((j % 8) == 7) ll.add(new LzlSuperHandler());
}
long begin = System.currentTimeMillis();
for(int j = 0; j < 1000000; j++) for(Handler h: ll) h.handle(null);
System.out.println("time in ms: " + (System.currentTimeMillis() - begin));
System.out.println("i: " + i);
}
}
事实上,如果LinkedList仅包含一种Handler类型,例如SuperHandler,执行时间比包含2个、3个等不同类型的Handler要短。每次我将一个新类型的Handler添加到列表中,性能都会降低。
例如,当我仅更改此部分时,性能比上面的更好:
for(int j = 0; j < 100; j++) {
if((j % 2) == 0) ll.add(new SuperHandler());
if((j % 2) == 1) ll.add(new NoSuperHandler());
}
这里有一些特别的优化操作吗?在JAVA架构中,性能下降是由什么引起的?如果未使用的Handler被“删除”或编译器“隐藏”,那么我的测试是否有误?(我正在使用Linux Ubuntu - Oracle的JAVA 1.7)