java - Java 编译器或 JVM 是否会忽略优化语句?

标签 java optimization

假设我们有以下语句

arrayList.size(); 

这个语句本身没有任何作用。出于优化目的,任何 Java 编译器或 JVM 都会忽略此语句吗?

实际上,编译器或 JVM 假定该语句没有副作用,因此将其删除以进行优化。

最佳答案

正如评论中所述,它并不完全是无操作:至少,它必须执行空检查。此外,ArrayList 的子类可能有不同的工作方式。理论上,他们甚至可以从数据库等中获取数据。通常,没有人会子类化 ArrayList 来执行此操作,但这样的 List 实现是有意义的。

编译器(JIT,而不是 javac)必须能够证明它确实没有副作用。通常,它非常简单,如下所示

  • 它知道是否存在 ArrayList.size() 的任何重写实现。1
  • 如果没有,那么它会认为这是一个简单的 getter 并将其内联。23
  • 这会减少无用字段加载的问题,从而减少空检查。
  • 如果较早执行的话,空检查也可以被消除(例如,由于之前的无用语句:D)。
  • 否则,如果 arrayList 是循环不变式,则它可能会移出循环。

Will any Java compiler or JVM ignore this statement for optimization purposes?

所以我得出结论,这很有可能发生。

<小时/>

1 这可能会在稍后加载此类时发生变化,然后去优化将会发生。
2 假设它决定值得优化。
3 如果方法已经超过内联限制,例如由于不良的编码风格或其他内联,这可能会失败。

关于java - Java 编译器或 JVM 是否会忽略优化语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26916336/

相关文章:

java - JAXB 无法将接口(interface)作为参数和返回类型处理

optimization - 在初始编码期间进行优化是一个好习惯吗?

php - 使用 GZip 压缩输出

java - 如何从字符串数组中删除一个元素?

java - 有没有办法在构建时自动替换 .java 文件中的模式?

java - 使用 Gradle 进行测试

java - 对单个进程集体使用多个线程

java - 聚合计划

c++ - 循环矢量化 001

python - 访问对象数据切片 numpy 数组