15

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

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

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

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

4

3 回答 3

3

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

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

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

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

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

于 2009-06-02T04:49:34.720 回答
0

David Notario 在他的博客上有一些帖子(你可以从这里开始,然后浏览历史),但它们相当粗略。

于 2009-06-02T06:03:39.577 回答
-5

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

于 2009-06-02T05:14:06.513 回答