1

编译器是否以相同的方式处理以下两种情况,或者情况 2 是否提供了性能提升,因为 x/2 没有不断地重新评估?我一直认为是后者,但如果有人能证实这一点,那就太好了。

情况1:

double result;
for (int i = 0; i < 10000000; i++) {
    result += variables[i] * (x/2);
}
return result;

案例二:

double result;
double xOverTwo = x/2;
for (int i = 0; i < 10000000; i++) {
    result += variables[i] * (xOverTwo);
}
return result;
4

1 回答 1

7

这取决于是什么x

如果它是一个常数,那么计算是在编译时完成的,所以两个代码执行相同。如果它是一个 volatile 变量,那么编译器每次都会被迫进行计算,那么你肯定会从循环外计算它中受益。

对于任何其他情况,这取决于编译器本身是否可以优化代码以在循环外进行计算。为了安全起见,您可以计算循环外的值。

当然,在您的示例中,您根本不需要x在循环内部使用,这将是修改使用的方法而不是尝试优化它的示例:

double result;
for (int i = 0; i < 10000000; i++) {
    result += variables[i];
}
return result * (x / 2);
于 2012-11-10T23:51:36.250 回答