当前位置: 首页 > 面试题库 >

调用array.length的成本是多少

萧胜
2023-03-14
问题内容

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

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

代替

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

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

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


问题答案:

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

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

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

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

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

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


 类似资料:
  • 问题内容: 有什么更好的: 代替这个: 当我输入try块时,JVM实际上会做什么? 编辑:我不想知道在第二个示例中总是要尝试…请回答问题。 问题答案: 在运行时明智地执行,只要没有例外,尝试不会花费您任何费用。只有在发生异常时才花费运行时间。在这种情况下,进行if评估要慢得多。 在JVM规范中,您看到执行路径上没有生成额外的字节码:http : //docs.oracle.com/javase/s

  • 问题内容: 我有一张有60列的桌子。其中的20个是“ NotEmpty”和6个“ NotNull”。 我有空值和空值(在我的情况下,它们始终表示“无数据”)。我想只用一种约束来统一列。 我已读取null值很便宜(以字节为单位)。那么也许使用NotEmpty约束?但是,也许NotNull约束的执行效果更好?或者在检索数据时最好同时拥有值和用途? 什么是成本的制约和Postgres里9.x中?您的经历

  • 我想全面了解一个Docker容器的运行时性能成本。我发现网络的参考文献要慢大约100µs。 我还发现对运行时成本的引用“可以忽略不计”和“接近于零”,但我想更准确地了解这些成本是什么。理想情况下,我想知道Docker抽象的是什么,但需要付出性能代价,以及抽象出来的东西不需要付出性能代价。联网、CPU、内存等。 此外,如果存在抽象成本,是否有方法绕过抽象成本。例如,也许我可以直接挂载磁盘,而不是在D

  • 问题内容: 我有一个循环,可以调用API并将结果编译成数组。我如何等待所有调用完成后才能恢复执行?我看到了一系列有关如何等到打完一个电话的答案,但我不知道如何检查所有这些。如果我做一个while循环,一直等到’obj’是正确的长度,则页面只会停顿直到调用完成,这不是我想要的。请帮助? 问题答案: 如果您使用jQuery的deferred,这很容易。有一种方法,等待多个诺言完成,然后运行回调。那就是

  • 问题内容: 当我尝试研究内核的系统调用的返回值时,我会找到描述它们的表,以及需要放入不同的寄存器中才能使它们工作的表。但是,我找不到任何文档说明它从系统调用中获得的返回值是 什么 。我只是在不同的地方发现我收到的将在EAX寄存器中。 TutorialsPoint: 结果通常在EAX寄存器中返回。 汇编语言循序渐进:使用Linux编程 Jeff Duntemann的书在其程序中多次陈述: 查看EAX