【问题标题】:What is /optimize C# compiler key intended for?/optimize C# 编译器密钥的用途是什么?
【发布时间】:2014-09-10 22:11:43
【问题描述】:

是否有由/optimize C# compiler key 完成的优化的完整列表在任何地方都可用?

编辑: 为什么默认禁用? 是否值得在实际应用中使用? -- 默认情况下,它仅在 Debug 配置中禁用,在 Release 中启用。

【问题讨论】:

标签: c# optimization compiler-construction


【解决方案1】:

Scott Hanselman has a blog post 展示了 /optimize(在 Release Builds 中启用)功能的几个示例。

作为一个总结:/optimize 做了很多事情,没有给出确切的数字或定义,但其中一个更明显的是方法内联(如果你有一个方法 A() 调用 B() 调用 C() 调用D(),编译器可能会“跳过” B 和 C,直接从 A 转到 D),这可能会导致 Release 构建中出现“奇怪”的调用堆栈。

【讨论】:

    【解决方案2】:

    调试版本默认禁用。对于发布版本,它已启用。

    启用此开关绝对值得,因为编译器会根据您拥有的代码类型进行大量调整和优化。 例如:跳过冗余初始化、永不改变的比较等。

    注意:如果您打开优化,您可能会遇到一些困难,因为您拥有的代码和生成的 IL 代码可能不匹配。这就是它仅对 Release 版本启用的原因。

    【讨论】:

    • 哦,确实。我会更新问题。但我仍然想知道确切(或足够完整)的优化列表是什么......
    【解决方案3】:

    引用自MSDN page

    /optimize 选项启用或 禁用执行的优化 编译器来制作你的输出文件 更小、更快、更高效。

    换句话说,它完全按照您的想法执行 - 优化由 .NET VM 执行的已编译 CIL(通用中间语言)代码。我不会担心具体的优化是什么——只要说它们很多,在某些情况下可能相当复杂。如果您真的对它的功能感兴趣,您可以调查Mono C# Compiler(我怀疑有关 MS C# 的详细信息是否公开)。

    调试配置默认禁用优化的原因是它使某些调试功能变得不可能。一些值得注意的:

    • 也许最关键的是,Edit and Continue 功能被禁用 - 即在执行期间不修改代码。
    • 中断执行通常意味着错误的代码行被突出显示(通常是预期代码行之后的代码行)。
    • 未使用的局部变量实际上并没有被赋值,甚至没有被声明。

    真的,优化的默认选项永远不应该改变。关闭调试选项非常有用,而在发布模式下打开它同样明智。

    【讨论】:

    • 我不担心优化,我只想知道它们是什么 :-) 我也想为你的努力点赞,但有一件事阻止了我这样做: “.NET 虚拟机”:-)
    • + 1 票。尽管这个术语远非精确,但从概念的角度来看,将 CLR 称为 VM 并不是完全错误的。您有伪机器代码 CIL,它在不存在但由 CLR 模拟的机器上运行。可以说,CLR JIT 代码这一事实是一个实现细节,尽管它会带来巨大(大部分是有益的)后果。
    • @Rui:谢谢...是的,我知道从技术上讲它是 CLR,但为了许多论点,我倾向于互换使用这些术语。但是,您的解释确实澄清了一些事情。还值得注意的是,CLR 的 Java 等价物被明确称为 VM(JVM),我相信甚至 MS 有时也将其称为 VM,因此该术语在这种情况下相当常用。
    • Java 将其虚拟机实现为字节码解释器已经有一段时间了。 .NET 从来没有这种结构,所以 MSIL 本身从来没有“执行”过,只是编译过。
    • @Yacoder:运行时编译不同于AOT编译。 IL 字节码是中间语言,因此 CLR 是一个抽象出底层硬件的经典 VM。我希望人们不要如此沉迷于语义,尤其是当他们错了的时候。
    猜你喜欢
    • 2015-05-11
    • 2021-08-02
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多