为什么编译器要优化我的代码?
我有两个函数:
x2和x3可能可以,但为什么x1的优化结果不同呢?没有理由保持它是一个两步增量的形式。 而且为什么y3不是
这就引出一个问题:如果C#编译器不能处理这样简单的代码优化,那它到底能做些什么优化呢?
当我阅读关于编写代码的文章时,经常听到“代码要易读,编译器会完成其余工作”。但在这种情况下,编译器几乎什么也没做。
再来看一个例子:
为什么不是 this.x = 3?
public void x1() {
x++;
x++;
}
public void x2() {
x += 2;
}
public void x3() {
x = x + 2;
}
public void y3() {
x = x * x + x * x;
}
在发布模式下编译后,我可以使用ILSpy看到以下内容:
// test1.Something
public void x1()
{
this.x++;
this.x++;
}
// test1.Something
public void x2()
{
this.x += 2;
}
// test1.Something
public void x3()
{
this.x += 2;
}
// test1.Something
public void y3()
{
this.x = this.x * this.x + this.x * this.x;
}
x2和x3可能可以,但为什么x1的优化结果不同呢?没有理由保持它是一个两步增量的形式。 而且为什么y3不是
x=2*(x*x)
?这难道不会比x*x+x*x
更快吗?这就引出一个问题:如果C#编译器不能处理这样简单的代码优化,那它到底能做些什么优化呢?
当我阅读关于编写代码的文章时,经常听到“代码要易读,编译器会完成其余工作”。但在这种情况下,编译器几乎什么也没做。
再来看一个例子:
public void x1() {
int a = 1;
int b = 1;
int c = 1;
x = a + b + c;
}
并使用ILSpy:
// test1.Something
public void x1()
{
int a = 1;
int b = 1;
int c = 1;
this.x = a + b + c;
}
为什么不是 this.x = 3?
x=2*(x*x)
比x = x * x + x * x
更优化?可读性或术语的简化并不意味着公式操作更加优化,有时展开它反而更加优化。 - Ron Beyerx1
您建议的优化在多线程面前并非功能等价(例如,如果该字段是volatile的,则编译器绝对禁止执行建议的优化)。