编译器会优化重复的数学计算吗?

mne*_*emy 6 java

Java Compiler会优化简单的重复数学运算,例如:

if (prevX / width != curX / width) {
    // Do something with prevX / width value
} else {
    // Do something with curX / width value
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以在if语句之前将结果分配给变量,并返回变量,但这有点麻烦.如果编译器自动识别出正在进行相同的计算并将结果缓存到临时变量,我宁愿坚持上述约定.

*编辑 - 我是个白痴.我试图简单地/抽象地提出我的问题.这并不简单:if(x> y)

Mys*_*ial 7

答案是肯定的.这称为Common Subexpression Elimination,是Java,C/C++等中使用的标准(强大)编译器优化...

此页面确认HotSpot JVM将执行此优化.


也就是说,编译器/运行时是否能够在您预期的情况下进行此优化是另一回事.所以我通常更愿意自己做这些优化,如果它也增强了可读性.

double xw = x / width;
double yw = y / width;

if (xw > yw) {
    return xw;
} else {
    return yw;
}
Run Code Online (Sandbox Code Playgroud)