C# C语言编译器是否自行执行任何实际优化?

C# C语言编译器是否自行执行任何实际优化?,c#,.net,compiler-optimization,C#,.net,Compiler Optimization,基于随机的互联网评论,我一直认为C#编译器会对IL进行简单的优化(删除always true if语句、简单内联等),然后JIT会执行真正的复杂优化 作为一个例子,它说 /optimize选项启用或禁用编译器执行的优化,以使输出文件更小、更快、更高效 这意味着语言编译器至少应用了一些优化 然而,玩弄权术,这似乎不是真的。看起来C#编译器根本没有进行任何优化 例子 输入: bool y = true; if (y) Console.WriteLine("yo"); static voi

基于随机的互联网评论,我一直认为C#编译器会对IL进行简单的优化(删除always true if语句、简单内联等),然后JIT会执行真正的复杂优化

作为一个例子,它说

/optimize选项启用或禁用编译器执行的优化,以使输出文件更小、更快、更高效

这意味着语言编译器至少应用了一些优化


然而,玩弄权术,这似乎不是真的。看起来C#编译器根本没有进行任何优化

例子 输入:

bool y = true;
if (y)
    Console.WriteLine("yo");
static void DoNothing() { }

static void Main(string[] args)
{
    DoNothing();
    Console.WriteLine("Hello world!");
}
try
{
    throw new Exception();
}
catch (Exception)
{
    Console.WriteLine("Hello world!");
}


输入:

bool y = true;
if (y)
    Console.WriteLine("yo");
static void DoNothing() { }

static void Main(string[] args)
{
    DoNothing();
    Console.WriteLine("Hello world!");
}
try
{
    throw new Exception();
}
catch (Exception)
{
    Console.WriteLine("Hello world!");
}


输入:

bool y = true;
if (y)
    Console.WriteLine("yo");
static void DoNothing() { }

static void Main(string[] args)
{
    DoNothing();
    Console.WriteLine("Hello world!");
}
try
{
    throw new Exception();
}
catch (Exception)
{
    Console.WriteLine("Hello world!");
}


如您所见,C语言编译器似乎根本没有进行任何优化


这是真的吗?如果是这样,为什么文档声称
/optimize
会使可执行文件变小?

/optimize
标志对编译器说“嘿,有这段代码,请尽可能地进行优化”,但这并不意味着这就是圣杯标志优化。

/optimize
标志执行许多操作,如删除未使用的变量、替换已声明但未使用的变量(如您的示例)、代码中的求和数(例如,
inta=2+2;
变成了
inta=4;
和许多其他你能找到的东西,

我能想到的唯一的优化,就是C编译器执行的,你可以通过反编译器看到的,就是添加一个空的静态构造函数

它们通常很无趣,只是更紧凑的IL。你只能在查看IL时才能看到它们,一个像样的反编译器不会显示出来。未优化的代码具有递归像样编译器的代码生成器的典型构件,冗余存储紧接着加载同一变量,分支到下一个address。优化器知道如何消除它们。标准示例是为帮助调试而发出的NOP,它们允许您在花括号上设置断点。优化器将其删除


没有什么可以提供一个容易观察到的性能改进,尽管你可能很幸运,更紧凑的IL恰好给抖动优化器足够的时间来消除一个关键的内存存储。这并不经常发生。

它确实优化了
y
远离…你真正需要做的是将IL代码与optimi进行比较ze和非优化版本。不是反编译版本。你怎么知道这个在线编译使用优化?@ScottChamberlain该网站也支持IL输出和非优化版本。他注意到,无论是否启用优化,编译器都会进行类似
2+2
的文本计算。Eric Lippert有一个se在可为空的选项上的延迟。开关也会受到严重的处理。基本上,JIT应该做什么。