C#编译器和JIT都做了哪些优化?

mmc*_*ole 15 c# compiler-construction optimization jit

我继续在我的编译器类的C#编译器上工作.目前我已经完成了教科书中关于编译器优化的章节.

在大多数情况下,我的教科书在编写时没有考虑到及时编译,我对C#编译器执行的静态,预jit优化的种类与JIT过程中的执行情况感到好奇?

当我与人们谈论有关CLR的编译时,我通常会听到类似的事情,"大多数优化都是由JIT完成的".

是循环展开,常量折叠/传播,C#编译器在Jit之前完成指令交织还是由抖动处理?如果它们不是由抖动处理的,那么抖动对于即时编译器所做的那种优化是什么?

jer*_*jvl 3

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

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

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

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

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

  • 仅调试代码是由 C# 编译器删除的,而不是由抖动删除的。 (9认同)