Bad*_*125 6 java performance linked-list
以下代码测量从接口处理程序 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);
}
}
Run Code Online (Sandbox Code Playgroud)
事实是,如果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());
}
Run Code Online (Sandbox Code Playgroud)
这里有特殊的优化操作吗?JAVA架构中的性能会降低多少?我的测试是错误的,因为未使用的Handler被编译器"删除"或"隐藏"了吗?(我正在使用Linux Ubuntu - 来自Oracle的JAVA 1.7)
Jon*_*eet 10
这里有特殊的优化操作吗?
是.Hotspot非常聪明地处理虚拟方法.如果只有一些接口的实现,并且这些实现很小,它可以通过检查正确的类型和内联代码来避免完整的vtable-lookup.
当你有几个不同的实现时,它会回到vtable实现.(Hotspot非常聪明,可以撤销不再实用的优化.我很惊讶它们都挂在一起,但显然确实如此.)
请注意,这不是列表中有多少不同类的问题 - 这里还有更多类.有关详细信息,请参阅Peter的答案.