【问题标题】:What kind of optimizations do both the C# compiler and the JIT do?C# 编译器和 JIT 都做了哪些优化?
【发布时间】:2010-10-30 14:10:10
【问题描述】:

我将继续为我的编译器类开发 C# 编译器。目前,我几乎完成了教科书中关于编译器优化的章节。

在大多数情况下,我的教科书在编写时并没有考虑到即时编译,我很好奇 C# 编译器执行的静态预jit 优化与它在JIT 流程?

当我与人们谈论针对 CLR 进行编译时,我通常会听到诸如“大多数优化由 JIT 完成”之类的话。

循环展开、常量折叠/传播、指令交织等事情是由 C# 的编译器预先完成还是由抖动处理?如果它们没有被抖动处理,那么抖动会做什么样的优化,这是即时编译器所独有的?

【问题讨论】:

  • 你提到的大部分优化都是由抖动完成的。 C# 编译器会进行常量折叠,因为这是语言语义所要求的。使用 /o 运行的 C# 编译器仅执行简单的 IL 控制流优化,例如消除“分支到下一条指令”。这是一个很好的话题;我会看看我是否可以写一篇关于我们在 IL 级别进行哪些优化的博客文章。在下个月左右观看我的博客以获取详细信息。 ——
  • @Eric Lippert,太好了!没想到微软编译器团队的高级开发人员会做出回应!如果你记得,当你发表你的博客文章时,一定要从这里链接到它。反正我会留意的。谢谢埃里克。
  • 不客气。文章将于 6 月 11 日上架。

标签: c# optimization compiler-construction jit


【解决方案1】:

David Notario 在他的博客上有一些帖子(您可以start here,然后浏览历史),但它们相当粗略。

【讨论】:

    【解决方案2】:

    我可以想象有许多 JIT 独有的优化;具体来说,任何取决于应用程序运行的环境/上下文的优化。(注意,以下所有内容都是假设的,我不确定,哪些或是否实际执行了)

    最无聊:JIT 可以根据 32 位/64 位底层操作系统进行优化,甚至可能取决于确切的处理器架构。

    不适用: 更有趣的是:当应用程序不在调试上下文中运行时,JIT 可以优化仅在调试模式下运行的任何内容(例如某些条件代码)。

    最有趣的是:JIT 可以优化类中仅依赖于 readonly 字段的条件分支,因为至少从理论上讲,该值在类执行期间永远不会改变。

    基本上,我认为将优化推迟到 JIT 通常是可行的方法,因为在 JIT 时间,关于代码实际运行的上下文的可用信息最多,从而可以进行更有意义的优化。

    【讨论】:

    • 仅调试代码由 C# 编译器删除,而不是由抖动删除。
    【解决方案3】:

    我认为 C# 编译器没有进行任何优化。 JIT 完成所有工作。

    【讨论】:

    • 由于调试和发布版本在 IL 级别上是不同的,因此编译器会进行一些优化。
    • 我认为这种推理是错误的(例如,在“调试”中,编译器可能会插入无操作、其他序列点调试信息等),但这并不意味着“发布”会进行任何优化.
    • 调试版本可能会进行一些改进调试的悲观
    • 我想这归结为优化。不插入 NOP 可能不算作优化,但编译器实际上会删除发布版本中未使用的变量,我认为这是一种优化。
    • C# 编译器当然会进行优化。这就是 /o 标志的用途。不过,它们并不是非常复杂的优化。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多