最佳 JIT 優化
我已經閱讀並聽到了很多關於 JIT 編譯器如何進行原生程式碼編譯器無法實現的優化以及這些優化可以帶來巨大的性能提升的資訊。
所以我想知道,有哪些最重要的優化是 .NET Framework 或 JVM 所做的,而原生編譯器卻無法做到?此外,這些如何提供巨大的性能提升?
我不知道我是否正確地表達了這個問題,我想我可能在評論中有很多解釋要做
我可以舉一個優化的例子。假設你在某處有一個函式。(將其視為類似 C 的虛擬碼。)
void function(MyClass x) { x.doSomething(); for (obj in x.getWidgets()) obj.doSomethingElse(); }這是適當的模糊。但是,假設您的整個圖像中只有一個具體類繼承自
MyClass:MyConcreteClass。在這種情況下,JIT 可以內聯doSomething和getWidgets. 如果它知道從 返回的類型getWidgets,那麼它也可以內聯doSomethingElse。假設這裡
MyClass不是最終/密封類,提前編譯器無法內聯其方法(它不知道要內聯哪些函式);就編譯器所知,有一百種不同的MyClass.但是,JIT 可以針對圖像的目前狀態進行優化。 它可以在每次呼叫的開頭安裝一個檢查以
function確保它x是 aMyConcreteClass,然後執行內聯版本。如果您動態載入具有另一個繼承自 的具體類的模組MyClass,則檢查將失敗並且 JIT 將重新編譯該函式以使其成為通用的。這些是JIT 編譯器唯一可用的優化類型,但提前編譯器不可用:利用有關程序動態狀態的資訊並相應地重新編譯程序的優化。
請注意,一些提前編譯器能夠執行通常歸因於 JIT 編譯器的技巧。例如,過程間優化(或全域優化)和配置文件驅動優化。GCC 和 Clang 可以同時使用這兩種技巧,但大多數人不使用它們,因為打開它們需要額外的(人工)工作。JIT 編譯器可以在不打擾最終使用者的情況下啟用這些選項。
**巨大的性能提升:**我還沒有聽說過 JIT 編譯器有任何巨大的性能提升。C 和 C++ 程序在沒有 JIT 的情況下仍然很快。許多人仍然更喜歡 Fortran 進行數值工作(有充分的理由)。
**腳註:**我不確定你的術語。大多數 JIT 不也是本機程式碼編譯器嗎?除了 JIT 之外的其他類型的編譯器我會稱之為“提前”或 AOT,或者可能是“靜態”。(然後“編譯”和“解釋”之間的界限非常模糊。)