是否有任何Java编译器或JVM忽略语句进行优化?

时间:2014-11-13 18:57:04

标签: java optimization

假设我们有以下声明

arrayList.size(); 

这句话本身没有任何作用。任何Java编译器或JVM是否会忽略此语句以进行优化?

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

1 个答案:

答案 0 :(得分:4)

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

编译器(JIT,而不是javac)必须能够证明它实际上是一种副作用。通常,它非常简单

  • 它知道,如果有任何覆盖的ArrayList.size()实现。 1
  • 如果没有,那么它会看到它是一个简单的吸气剂并将其内联。 2 3
  • 这减少了无用的字段加载的问题,这会减少到空检查。
  • 如果之前执行了空检查,也可以消除空检查(例如,由于之前无用的声明:D)。
  • 否则,如果arrayList是循环不变量,它就会被移出循环。
  

任何Java编译器或JVM是否会忽略此语句以进行优化?

所以我得出的结论是很有可能发生。


1 这可能会在以后加载,然后会发生 deoptimization 2 假设它决定值得优化。
3 如果方法已超过内联限制,例如,由于编码风格错误或由于其他内联,这可能会失败。