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)
这取决于什么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)