假设我们有以下语句
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/