一尘不染

调用array.length的成本是多少

java

在我们的应用程序中将for循环更新为for-each循环时,我遇到了很多这样的“模式”:

for (int i = 0, n = a.length; i < n; i++) {
    ...
}

代替

for (int i = 0; i < a.length; i++) {
    ...
}

我可以看到你获得了集合的性能,因为你不需要在每个循环中调用size()方法。但是有了数组?

因此出现array.length了一个问题:比常规变量贵吗?


阅读 290

收藏
2020-03-13

共1个答案

一尘不染

否,呼叫array.lengthis O(1)或固定时间操作。

由于.lengthis(的行为类似于)的public final成员array,因此访问它的速度不会比局部变量慢。(这与对的方法的调用非常不同size()

.length无论如何,现代的JIT编译器很可能会优化调用。

你可以通过查看OpenJDK中的JIT编译器的源代码,或通过使JVM转储JIT编译的本机代码并检查代码来确认这一点。

注意,在某些情况下,JIT编译器无法做到这一点;例如

  1. 如果你正在调试封闭方法,或者
  2. 如果循环体具有足够的局部变量以强制寄存器溢出
2020-03-13