2009-06-02 93 views
15

我正在繼續我的編譯器類的C#編譯器。目前,我幾乎完成了我的教科書中關於Compiler Optimizations的章節。C#編譯器和JIT都做了什麼樣的優化?

大多數情況下,我的教科書在編寫時並沒有將Just-In-Time編譯出來,我很好奇C#編譯器執行的靜態,pre-jit優化的類型與它的功能在JIT過程中?

當我和人們談論CLR編譯時,我通常會聽到諸如「大多數優化都是由JIT完成」的事情。

類似循環展開,常量摺疊/傳播,指令交織由C#的編譯器完成之前的Jit或由抖動處理?如果它們不是由抖動處理的,那麼抖動對於即時編譯器來說獨特的優化是什麼樣的?

+11

您提到的大多數優化都是由抖動完成的。 C#編譯器進行常量摺疊,因爲這是語言語義所需的。運行/ o的C#編譯器只是簡單地進行IL控制流優化,就像消除「分支到下一個指令」一樣。這是一個很好的話題;我會看看我是否可以敲一篇關於我們在IL級別做什麼優化的博客文章。細節請在下個月左右觀看我的博客。 - – 2009-06-02 06:14:16

+0

@Eric Lippert,尼斯!沒有預料到微軟編譯團隊的高級開發人員的迴應!如果你記得,當你做博客文章時,一定要從這裏鏈接到它。無論如何,我會密切留意。謝謝埃裏克。 – mmcdole 2009-06-02 07:33:27

+3

不客氣。文章將在6月11日上升。 – 2009-06-02 17:02:45

回答

4

我可以想象有一些JIT特有的優化;具體來說,任何優化都取決於應用程序運行的環境/環境。(請注意,以下所有內容都是假設性的,我不確定這些實際執行的是哪一項或哪幾項)

最無聊: JIT可以根據32位/ 64位底層操作系統進行優化,甚至可能取決於確切的處理器體系結構。

不適用:更有意思:JIT可以優化了什麼,只是在調試模式下(例如某些條件代碼)運行時的應用程序是不是一個調試上下文中運行。

最有意思的是:JIT可以優化只取決於readonly字段的類中的條件分支,因爲至少理論上這個值在類的執行過程中永遠不會改變。

基本上我會想象推遲優化,直到JIT通常是要走的路,因爲在JIT時間有關於代碼實際運行的上下文的最多信息,使更有意義的優化成爲可能。

-5

我不認爲C#編譯器會做任何優化。 JIT負責所有的工作。

0

David Notario在他的博客上有幾個帖子(你可以start here,然後走歷史),但他們很粗略。