鉴于以下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)
}
答案 0 :(得分:5)
没有。编译器如何知道它们是相同的?
是什么让你认为Math.max会更快?它没有理由比你的功能更快地执行。
编译器可能很好地内联一个简单的函数 - 但这取决于编译器。
想象一下标准程序中有多少个库。编译器需要花费多少精力来扫描所有这些库以查找相同的代码片段。然后看看识别它们的收益有多微不足道。
现在还要考虑多个库的情况,两者都定义了这个方法。编译器需要保留两者,因为否则一个库变得依赖于另一个库,并且如果将来一个库改变或移除其方法的定义将会发生什么。
这是一堆巨大的蠕虫,最终没有真正的好处。
答案 1 :(得分:3)
Math.max
有一个很好的理由比手写方法更快:它是在list内在方法上。由于这是一个非常简单的操作,在给定的CPU上可能没有任何增益,但使用它可能是一个好主意。
对于更复杂的操作,使用内在函数可以大大加快速度。例如,Long.numberOfLeadingZeros(long)
的Java代码非常长,需要十几个周期(或者更多,有一些分支错误预测)。由于Hotspot JVM知道这种方法并且有相应的i86指令,你可以在一个周期内获得它(甚至可以同时执行其他指令的空间)。