首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Discovery 系列之五:JIT 編譯器深度解析(上)— 設計哲學、兩階段編譯與局部性原理

     編輯:關於.NET

JIT (Just-In-Time) 命名源自豐田「準時制」生產哲學:需要時、按需量、生產所需,完美對應 .NET 執行時編譯機制。

兩階段編譯

  1. C# → MSIL:編譯期產生托管模組 (PE32/PE32+),含 IL、中繼資料、PE Header、CLR Header。IL 為 CPU 無關偽組合語言(含載入/儲存/呼叫/運算/流程控制/例外處理指令)。
  2. MSIL → 原生碼:執行期由 JIT 編譯,產生 CPU 專屬機器碼。

JIT 介入時機

JIT 優勢:物有所值的開銷

  • 效能開銷不顯著:無異常時近零成本。
  • 遵循局部性原理與 80/20 法則:程式 80% 時間執行 20% 代碼,JIT 僅編譯熱點路徑,節省記憶體。
  • 運行時環境感知優化:同一 IL 在不同 CPU 產生不同優化機器碼。
  • 動態重編譯優化:執行畫像導向優化(內聯、策略引擎回饋、程式碼回收)。

首次編譯後修正入口點

JIT 編譯完成後修改方法對應的記憶體入口位址,後續呼叫直接跳轉,不再經 JIT。

編譯與執行流程示例

Load() 呼叫 A.a1() 兩次:

  1. 載入 Load() 觸發 JIT 編譯 Load。
  2. JIT 掃描 Load 參考類型 A,遍歷其方法 (a1, a2, a3) 建立方法表 (HashTable),初始入口皆為 PreJitStub。
  3. 執行至 A.a1("First"),觸發 a1 JIT 編譯,方法表更新為機器碼位址。
  4. 執行至 A.a1("Second"),直接跳轉機器碼。

下篇將詳細說明方法表演變、WinDbg 驗證與 NGen 取捨。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved