给定以下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)
}发布于 2013-12-11 22:05:07
不是的。编译器如何知道它们是相同的?
你凭什么认为Math.max会更快呢?它没有理由比您的功能执行得更快。
不过,编译器很可能会内联这样一个简单的函数--但这取决于编译器。
想象一下一个标准程序中有多少库。编译器需要付出多少努力才能扫描所有这些库,寻找相同的代码片段。然后看看识别它们的收益有多小。
现在还考虑多个库的情况,其中两个库都定义了这个方法。编译器需要离开这两个库,因为否则一个库就会依赖另一个库,如果将来一个库更改或删除了它对方法的定义,那么会发生什么情况。
这是一大罐乱七八糟的蠕虫,最终并没有真正的好处。
发布于 2013-12-12 00:05:17
Math.max比手写方法更快是有一个很好的理由的:它在内在方法的列表上。因为这是一个非常简单的操作,在给定的CPU上可能没有收益,但是使用它可能是一个好主意。
对于更复杂的操作,使用内在知识的速度将大大加快。例如,Long.numberOfLeadingZeros(long)的Java代码相当长,需要十几个周期(或者更多的是一些分支错误的预测)。由于Hotspot JVM知道这个方法,并且有一个相应的i86指令,您可以在一个周期内得到它(甚至为其他指令同时执行留出空间)。
https://stackoverflow.com/questions/20530844
复制相似问题