Java – LinkedList – 性能随着其中不同类的数量而减少
|
以下代码测量从接口处理程序100次调用方法句柄(对象o)所花费的时间(是的,它的质量差异分析): 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被编译器“删除”或“隐藏”了吗? 解决方法
是. Hotspot非常聪明地处理虚拟方法.如果只有一些接口的实现,并且这些实现很小,它可以通过检查正确的类型和内联代码来避免完整的vtable-lookup. 当你有几个不同的实现时,它会回到vtable实现. (Hotspot非常聪明,可以撤销不再实用的优化.我很惊讶它们都挂在一起,但显然确实如此.) 请注意,这不是列表中有多少不同类的问题 – 这里还有更多类.有关详细信息,请参阅Peter的答案. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
