Java会优化最大化操作吗?

时间:2013-12-11 22:02:11

标签: java optimization

鉴于以下Java代码,JRE优化器是否会通过调用max替换对Math.max的调用?

未经优化的代码

public static void main(String[] args) {
  int max = max(3, 5);
}

public int max(int x, int y) {
  if (x < y) {
    return y;
  }
  else {
    return x;
  }
}

优化代码

public static void main(String[] args) {
  int max = Math.max(3,5)
}

2 个答案:

答案 0 :(得分:5)

没有。编译器如何知道它们是相同的?

是什么让你认为Math.max会更快?它没有理由比你的功能更快地执行。

编译器可能很好地内联一个简单的函数 - 但这取决于编译器。

想象一下标准程序中有多少个库。编译器需要花费多少精力来扫描所有这些库以查找相同的代码片段。然后看看识别它们的收益有多微不足道。

现在还要考虑多个库的情况,两者都定义了这个方法。编译器需要保留两者,因为否则一个库变得依赖于另一个库,并且如果将来一个库改变或移除其方法的定义将会发生什么。

这是一堆巨大的蠕虫,最终没有真正的好处。

答案 1 :(得分:3)

Math.max有一个很好的理由比手写方法更快:它是在list内在方法上。由于这是一个非常简单的操作,在给定的CPU上可能没有任何增益,但使用它可能是一个好主意。

对于更复杂的操作,使用内在函数可以大大加快速度。例如,Long.numberOfLeadingZeros(long)的Java代码非常长,需要十几个周期(或者更多,有一些分支错误预测)。由于Hotspot JVM知道这种方法并且有相应的i86指令,你可以在一个周期内获得它(甚至可以同时执行其他指令的空间)。