【问题标题】:Is compiling Release and Debug going to generate different IL code + different machine code?编译 Release 和 Debug 会生成不同的 IL 代码 + 不同的机器代码吗?
【发布时间】:2012-11-24 23:20:46
【问题描述】:

我听说在 Release 模式下编译比在 Debug 模式下编译生成优化的代码,这很好。

但是这种优化是在 IL 中吗?一旦CLR运行它,它就在机器代码中吗? Release和Debug编译的元数据结构和PE有区别吗?

谢谢

【问题讨论】:

  • 问得好,但你为什么想知道?
  • 因为我在一次工作面试中被拒绝并且很生气。我确实认为我们开发人员应该更多地了解这些事情是如何在幕后工作的

标签: c# .net vb.net csc .net-framework-version


【解决方案1】:

这不是对确切问题的答案。只是要补充一点,您可以在 preprocessor 标记的帮助下有目的地标记哪些代码必须在调试模式下运行,哪些在发布模式下运行。

 #if DEBUG
    // code only meant for debug mode
 #endif

 #if NOT DEBUG
    // code only meant for release mode
 #endif

所以如果你这样做,你会得到不同的 IL 生成。

【讨论】:

    【解决方案2】:

    Building in Release build 打开 C# 编译器的 /optimize 编译选项。这有 几个 副作用,IL 确实发生了变化,但变化不大。值得注意的是,编译器不再努力使代码完全可调试。例如,它会跳过一个空的静态构造函数,它不再发出允许您在花括号上设置断点并允许具有不同范围的局部变量在堆栈帧中重叠的 NOP 操作码。小东西。

    最重要的区别是为程序集发出的 [Debuggable] 属性,其 IsJITOptimizerDisabled 属性为 false。

    打开 real 优化器,即内置于抖动中的优化器。您可以在this answer 中找到它执行的优化列表。请注意这种方法的用处,任何语言都受益于在抖动中使用代码优化器而不是编译器。

    简而言之,IL 的变化非常小,生成的机器代码变化非常大。

    【讨论】:

      【解决方案3】:

      在 VB 中有一个副作用是编辑 + 继续支持编译到可执行文件中,这可能会导致内存泄漏。它受到使用 WithEvents 关键字声明的任何事件的影响。 WeakReference 跟踪这些事件实例。问题是,如果您在没有调试器的情况下运行应用程序,这些 WeakReferences 就会泄露。进程消耗内存的速度很大程度上取决于创建了多少类实例。泄漏是每个对象每个事件 16 个字节。

      免责声明:抄自汉斯的回答here

      this Microsoft knowledge base article

      【讨论】:

        【解决方案4】:

        cil 不同,它是经过优化的。由于机器代码是 cil 的翻译,因此它也有所不同。可以自己看,在visual studio中打开反汇编窗口即可。元数据应保持不变,因为您不会更改版本之间的类合同结构。

        【讨论】:

          【解决方案5】:

          是的,IL 中有一些优化 - 特别是,调试版本将包含 NOP 指令,这使调试器可以轻松插入断点,我相信。在提供的调试信息级别(行号等)方面也存在潜在差异。

          我建议你拿一个小示例程序,两种方式都编译,然后查看ildasm中的输出。

          C# 编译器没有进行很多优化 - JIT 编译器做了大部分 - 但我认为存在一些差异。

          【讨论】:

          • 谢谢,请问元数据结构是否会根据编译模式而改变?
          • @EdwinSoho:还是一样的格式。这真的取决于你所说的“结构”是什么意思。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-14
          • 2023-03-29
          相关资源
          最近更新 更多