Java for 循环优化 - 在循环之前存储 getter

标签 java performance for-loop compiler-optimization callstack

假设您有以下代码..

for(Element elm : elements)
   if(elm instanceof Foobar)
      Session.getSomething().getListOfSomething().add((Foobar)elm);

执行以下操作不是更好吗?

List<Foobar> list = Session.getSomething().getListOfSomething();

for(Element elm : elements)
   if(elm instanceof Foobar)
      list.add((Foobar)elm);

假设 Something 和 listOfSomething 在循环执行期间没有改变。 我认为由于减少了方法调用,这可以大大减少调用堆栈推送/弹出的数量。

这种优化是不是太挑剔了?我不认为 java 编译器会假设他们可以通过这种方式进行优化。

编辑:未简化代码以排除 AddAll 的使用

最佳答案

在大多数情况下这会更好。原因是 Java 对调用约定非常严格,每次迭代都必须进行 4 次额外的虚拟调用。有一些异常(exception)(即通过 JIT 内联),但这是一种奇特的情况。

尽管使用默认函数可能会更好:

Session.getSomething().getListOfSomething().addAll(elements)

关于Java for 循环优化 - 在循环之前存储 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16090667/

相关文章:

具有扩展原型(prototype)和 "for-in"循环的 JavaScript native 对象

java - HATEOAS 对嵌入资源进行排序/排序

java - Hibernate:org.hibernate.WrongClassException、SINGLE_TABLE 继承和 DiscriminatorFormula

java - 我试图在浏览器中加载我的 servlet,它给了我这个错误

PHP - 向我解释这个 while/for 循环

c - 为什么我的程序中有无限循环?

无法调用但可以重写的 Java 方法

performance - Julia:稀疏矩阵的 View

performance - Spree 3 网站速度很慢

java - 极慢的 Netezza(数据库)批量插入