在 Dov Bulka 的 Java Performance and Scalability: Volume 1 中,作者提到使用诸如
之类的东西在ArrayList
上循环
for (int i = 0; i < vector.size(); i++) {
// do something that does not modify vector size...
}
实际上是一个小的优化问题,因为 vector.size()
的不断计算,因此意味着诸如
int size = vector.size();
for (int i = 0; i < size; i++) {
// do something that does not modify vector size...
}
实际上效率稍微高一点。由于本书是在 2000 年编写的,作者使用的是 Sun 1.2.2 JDK。
这个条件是否仍然适用于更新的 JDK?或者 Java 编译现在是否足够智能以消除这些低效问题,尽管它们可能有多么小?
编辑:我不担心代码中的这些微小优化;我只是对 JDK 的演变感到好奇。
最佳答案
检查循环字节码:
12: iload_3
13: aload_2
14: invokeinterface #4, 1 // InterfaceMethod java/util/List.size:()I
19: if_icmpge 31
22: iinc 1, 1
25: iinc 3, 1
28: goto 12
将其放入可变字节码中:
10: aload_2
11: invokeinterface #4, 1 // InterfaceMethod java/util/List.size:()I
16: istore_3
17: iconst_0
18: istore 4
20: iload 4
22: iload_3
23: if_icmpge 35
26: iinc 1, 1
29: iinc 4, 1
32: goto 20
好像它每次都调用它,所以实际上把它放在一个变量中更快,我不担心。请注意,我是字节码方面的新手,我可能完全错了。
关于Java ArrayList for循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611294/