如何优化C#编译器?

mic*_*idk 1 .net c# optimization cil compiler-optimization

这段代码的IL代码(用https://dotnetfiddle.net生成):

public class Program
{
    public static void Main()
    {
        int i = 10;
        if (i < 4)
            Console.WriteLine("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

包含ldstr"Hello World".

编译器不应该知道Console.WriteLine永远不会被执行吗?

这个IL代码:

public class Program
{
    public static void Main()
    {
        if (10 < 4)
            Console.WriteLine("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

不包含ldstr命令.

现在我很困惑.. .NET编译器真的很蠢吗?两个示例的C#/ IL代码完全相同:没有.但是第一个例子的IL代码比另一个大.不应该是一个好的编译器只是调用构造函数而什么都不做..?

编辑:

是的我已经读过这个,但我不是在谈论其他生成的本地人.

如果i是属性或公共变量,则可以从另一个线程修改它.但i只存在于Main()......

Luc*_*ski 8

这是你的代码片段的x64反汇编:

00007FF7C6083E0E  add         byte ptr [rax],al  
--- C:\Dev\Temp\Test\ConsoleApp\ConsoleApp\Program.cs --------------------------
            int i = 10;
00007FF7C6083E10  ret  
--- No source file -------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这意味着,JIT执行死代码消除(ret= 返回,Main函数只是立即退出).

编译器只执行一些基本的优化,但大部分都留给JIT,以优化它运行的平台.

虽然我同意编译器肯定可以在这种情况下执行此优化,因为它与平台无关.

  • @michidk这只是VS显示的源到程序集映射,以帮助您找到绕过汇编代码的方法.它向您显示这行代码大致映射到`ret`,因此本地甚至不存在. (4认同)