我正在为我的编译器类继续我的C#编译工作。目前我已经完成了教科书中关于编译器优化的章节。
在大多数情况下,我的教科书在编写时没有及时编译,我很好奇C#编译器执行的静态,预jit优化的类型与它在执行期间所做的相比。 JIT流程?
当我与人们讨论针对CLR进行编译时,我通常会听到“大多数优化都是由JIT完成”之类的事情。
是循环展开,常量折叠/传播,C#编译器在Jit之前完成指令交织还是由抖动处理?如果它们不是由抖动处理的,那么抖动对于即时编译器所做的那种优化是什么?
答案 0 :(得分:4)
我可以想象有许多JIT独有的优化;具体而言,任何取决于应用程序运行的环境/上下文的优化。(注意,以下所有内容都是假设的,我不确定,实际执行了哪些或其中任何一个)
最无聊:JIT可以根据32位/ 64位底层操作系统进行优化,甚至可能取决于确切的处理器架构。
不适用: 更有趣的是:当应用程序未在调试上下文中运行时,JIT可以优化仅在调试模式下运行的任何内容(例如某些条件代码)。 / em>的
最有趣的是:JIT可以在仅依赖于readonly
字段的类中优化条件分支,因为至少理论上该值在类的执行期间永远不会改变。
基本上我认为推迟优化直到JIT通常是要走的路,因为在JIT时间,关于代码实际运行的上下文的信息最多,可以进行更有意义的优化。
答案 1 :(得分:0)
David Notario在他的博客上有一些帖子(你可以start here,然后走历史),但他们相当粗略。
答案 2 :(得分:-5)
我不认为C#编译器会进行任何优化。 JIT完成所有工作。