预先计算循环中使用的常量(或其他任何地方)是否有益?

Cod*_*095 1 c# loops constants

编译器是否同样处理下面两种情况,或者情况2是否提供了性能提升,因为x/2不会经常重新评估?我总是假设后者,但如果有人能证实这一点,那将会很棒.

情况1:

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

案例2:

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

Guf*_*ffa 7

这取决于什么x.

如果它是常量,则计算在编译时完成,因此两个代码执行相同.如果它是一个volatile变量,那么编译器每次都会被强制进行计算,所以你肯定可以在循环外计算它.

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

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

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