gpt4 book ai didi

Java - LinkedList - 性能随着其中不同类的数量而降低

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:49:14 24 4
gpt4 key购买 nike

以下代码测量了从接口(interface) Handler 调用方法 handle(Object o) 100 次所花费的时间(是的,这是糟糕的质量分析):

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 - JAVA 1.7,来自 Oracle)

最佳答案

Is there a special optimization operating here ?

是的。 Hotspot 在处理虚拟方法方面非常聪明。如果一个接口(interface)只有几个实现,而且这些实现很小,它可以通过检查正确的类型和内联代码来避免完整的 vtable 查找。

当你有几个不同的实现时,它会回到 vtable 实现。 (Hotspot 足够聪明,可以撤消不再实用的优化。令我震惊的是它们全部卡在一起,但显然确实如此。)

请注意,这与列表中有多少个不同的类无关 - 这里还有更多内容。有关详细信息,请参阅彼得的回答。

关于Java - LinkedList - 性能随着其中不同类的数量而降低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com