將函式分解為小單元,JIT 編譯器僅需編譯實際執行的路徑。若在單一大型函式中包含多個分支,首次呼叫時 JIT 會編譯所有分支,造成浪費。小函式讓 JIT 只編譯必要邏輯,減少編譯時間與記憶體佔用。
JIT 編譯器對小而簡單的函式更容易進行「可登記」處理,將區域變數存入 CPU 暫存器而非堆疊。簡單的控制流程(如單一迴圈)讓變數更易被分配至暫存器;過多迴圈則增加編譯器決策難度。
JIT 會決定是否內聯方法。屬性存取器指令極少,JIT 常將其內聯,以函式本體取代呼叫開銷。例如:
// 唯讀屬性
private string _name;
public string Name { get { return _name; } }
// 呼叫端
string val = Obj.Name;
若直接存取欄位 Obj._name 雖指令更少,但違反封裝原則。JIT 會在追求速度或大小時內聯合適的方法。開發者無法直接指示內聯,但撰寫小而清晰的方法能增加內聯機率。注意:虛擬方法或含 try/catch 的函式不會被內聯。
內聯會改變程式碼被 JIT 編譯的時機。例如:
string val = "Default Name";
if (Obj != null) val = Obj.Name;
JIT 內聯屬性存取器後,相關機器碼會在包含方法被呼叫時一次產生。
開發者不需決定機器層級的最佳表現;C# 編譯器產生 IL,JIT 負責轉換為機器指令。應專注於以清晰方式表達演算法,讓工具鏈發揮最大效能。使用小而簡單的函式,不僅是寫出清晰程式碼,更是建立執行時高效能程式碼的關鍵。