【发布时间】:2010-12-14 11:36:45
【问题描述】:
Java 中 Collections 的 size() 方法是否有编译器优化?
考虑以下代码:
for(int i=0;i<list.size();i++)
...some operation.....
每个 i 都会调用 size() 方法。找出尺寸并重复使用不是更好吗? (方法调用有开销)。
final int len = list.size()
for(int i=0;i<len;i++)
...some operation.....
但是,当我对这两个代码段进行计时时,没有明显的时间差异,即使 i 高达 10000000。 我在这里遗漏了什么吗?
Update1:我知道除非集合发生变化,否则不会再次计算大小。但是必须有一些与方法调用相关的开销。编译器是否总是内联这些(参见 Esko 的答案)?
更新 2: 我的好奇心被进一步激发。从给出的答案中,我看到好的 JIT 编译器通常会内联这个函数调用。但是他们仍然必须确定该集合是否被修改。我不接受答案,希望有人能给我一些关于编译器如何处理的指针。
【问题讨论】:
-
最好不要担心这样的事情,直到分析器向您显示这是您的应用程序的实际瓶颈,可能永远不会出现这种情况。拥有更易读的代码比速度快得可以忽略不计的代码要好。但从纯学术的角度来看,这仍然是一个很好的问题。
-
@Sergey:是的。我进行的简单测试表明我不应该担心效率。因此,更新。但这激起了我的好奇心。请参阅我对汤姆安德森评论的回复。
标签: java collections