【问题标题】:Compiler Optimization on C# if/elseC# if/else 上的编译器优化
【发布时间】:2011-11-15 14:19:01
【问题描述】:

我对编译器和 .Net 如何优化生成的机器代码没有太多了解,但想了解以下场景:

    class AnyClass
    {
        public bool anyFlag;
        AnyClass()
        {
            anyFlag = true;
        }

        public void Action()        
        {
            if(anyFlag)
                 //Perform Certain Actions
        }
    }

anyFlag 在整个程序范围内都不会改变。编译器会为 Action 方法生成 MIL/机器代码吗?如果是的话,那里会有 if check in 吗?

【问题讨论】:

  • 我猜你的意思是 private bool anyFlag;
  • 为什么单曲对你来说那么重要?
  • 我更多地从理解的角度提出了这个问题。我想这毕竟很重要:)

标签: c# .net compiler-construction compiler-optimization


【解决方案1】:

在您的情况下,编译器不会过滤 if 语句,因为您的 anyFlag 是公共的(因此可以从多个位置更改)并且因为该值仅在构造函数中设置,所以编译器现在也没有此值直到运行时。

下面的代码做你想做的事:

static void MyFunc()
{
    const bool flag = true;

    string s = null;
    if (flag)
    {
        s = "a";
    }
    else
    {
        s = "b";
    }
}

如果您在 Visual Studio 中插入此代码,您将看到一条生成的警告,指出 s="b";永远不会到达,这段代码将被优化出来。

【讨论】:

    【解决方案2】:

    是的,编译器会生成 IL。由于您以后可以使用反射或 Emit 来调用该方法或更改 anyFlag 的值,因此它会保留它。您可以使用 Visual Studio 附带的 ildasm 反汇编生成的可执行文件来展示这一点。

    【讨论】:

    • 但是在性能方面,IL 并不重要,JIT 生成的本机代码才是。
    • 当然,但由于 JITer 的优化是一个黑盒,因此没有关于这个问题的规范。你只需要相信它正在做它的工作。更重要的是生成了 IL 并且开发人员可以根据需要访问代码。
    • @Polynomial You can show this by disassembling the produced executable file using ildasm, 自己试试上面的代码(和const bool)。
    • @Polynomial 什么意思,没有说明? CLI 规范说明了每条 IL 指令的行为方式,尽管它没有具体说明应该使用哪些汇编指令。类似地,C# 规范说明了每个 C# 构造的行为方式,但并未确切说明应该使用什么 IL 指令。 (它甚至没有说你必须使用 IL!)
    • @L.B.当然,如果它是const bool,它将被省略。他的代码没有说const bool
    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多