【发布时间】:2016-11-16 19:54:51
【问题描述】:
在 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 的演变感到好奇。
【问题讨论】:
-
除非你能证明重复调用
size()是你代码中的瓶颈,否则不要浪费你的时间去担心这样的微优化。在任何情况下,这种优化只在特定条件下是安全的(即,当您在循环中时,没有其他线程可以更改vector的大小)。 -
考虑使用
for-each循环而不用担心List<>的内部结构。在 java 8 中,List#forEach(...)会隐藏得更多。 -
但是,“除非绝对必须在循环中执行,否则不要在循环中执行某些操作”的基本规则仍然适用。无论技术如何发展,在循环中减少计算量是一件好事。
标签: java for-loop optimization arraylist