28 9月 2011

[C#] 用 nGen.exe 來提升初始化效能

一般來說,Managed 可執行檔內的方法都會經過 Just-In-Time (JIT) 編譯。而一旦有了執行執行檔的處理序之後,JIT 編譯器所產生的機器碼就被棄置,所以下回再度執行應用程式時,就必須再次編譯方法。此外,所產生的程式碼和建立它的處理序之間關係緊密,其他執行同一個應 用程式的處理序並無法共用這些程式碼。
上述這些 .NET JIT 的編譯特色可能會導致效能方面的缺失,不過幸好有 NGen (原生影像產生),有助問題的化解。NGen 指的是將 Microsoft® Intermediate Language (MSIL) 可執行檔在執行前先行編譯成機器碼的這個過程,如此能在兩方面大幅提昇效能。首先,這樣可縮減應用程式的啟動時間,避免在執行階段編譯程式碼;其次,它可以改善記憶體的使用,允許跨多個處理序共用字碼頁。
乍看之下,NGen 似乎跟傳統的靜態末端編譯十分類似,然而實際上它們迥然不同。由於 NGen 影像一定要存放在用來建立它們的機器上,不然就無法被部署,因此它和靜態編譯的二進位碼檔案並不相同。相反的,應用程式的安裝程式必須發佈命令,在安裝時 期於用戶端機器上建立組件原生影像。另一個與傳統二進位碼檔案不同的地方是,NGen 影像只會形成 Cache-managed 應用程式,所以即使刪除了所有的 NGen 影像,應用程式仍可正常運作。當然啦,如果真的是那樣的話,效能可能會受到大幅影響,不過對正確度則沒有任何影響。但是如果 MSIL 組件在編譯成 NGen 影像後就被刪除,則 Managed 應用程式就無法正確運作。

ngen [options] [assemblyName |assemblyPath ]

參考資料
1. NGen 所帶來的效能優勢



沒有留言:

張貼留言