使用 NGen 改善啟動效能
注意
僅限 EF6 及更新版本 - Entity Framework 6 已引進此頁面中所討論的功能及 API 等等。 如果您使用的是較早版本,則不適用部分或全部的資訊。
.NET Framework 支援為受控應用程式和程式庫產生原生映射,以協助應用程式更快啟動,在某些情況下也會使用較少的記憶體。 原生映射的建立方式是在執行應用程式之前,將 Managed 程式碼元件轉譯成包含原生機器指令的檔案,藉此緩解 .NET JIT (Just-In-Time) 編譯器在應用程式執行時間產生原生指令。
在 6 版之前,EF 執行時間的核心程式庫是 .NET Framework 的一部分,且原生映射會自動為其產生。 從第 6 版開始,整個 EF 執行時間已合併為 EntityFramework NuGet 套件。 原生映射現在必須使用 NGen.exe 命令列工具來產生,才能取得類似的結果。
經驗觀察顯示,EF 執行時間元件的原生映射可縮短 1 到 3 秒的應用程式啟動時間。
如何使用 NGen.exe
NGen.exe 工具最基本的功能是「安裝」(也就是建立並保存至磁片)元件及其所有直接相依性的原生映射。 以下是您可以達成此目的的方式:
開啟命令提示字元視窗,以系統管理員身分執行。
將目前的工作目錄變更為您要為下列專案產生原生映射的元件位置:
cd <*Assemblies location*>
根據您的作業系統和應用程式的組態,您可能需要針對 32 位架構、64 位架構或兩者產生原生映射。
針對 32 位執行:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>
針對 64 位執行:
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>
提示
為錯誤的架構產生原生映射是一個非常常見的錯誤。 當不確定時,您可以只針對套用至電腦上安裝之作業系統的所有架構產生原生映射。
NGen.exe 也支援其他功能,例如卸載和顯示已安裝的原生映射、佇列產生多個映射等等。如需使用方式的詳細資訊, 請參閱 NGen.exe 檔 。
使用 NGen.exe 的時機
在決定要根據 EF 第 6 版或更新版本在應用程式中產生原生映射的元件時,您應該考慮下列選項:
- 主要 EF 執行時間元件 EntityFramework.dll :一般 EF 型應用程式會在啟動時或第一次存取資料庫時,從這個元件執行大量程式碼。 因此,建立此元件的原生映射會產生啟動效能的最大收益。
- 應用程式 所使用的任何 EF 提供者元件:啟動時間也可以稍微受益于產生這些映射的原生映射。 例如,如果應用程式針對 SQL Server 使用 EF 提供者,您會想要為 EntityFramework.SqlServer.dll 產生原生映射。
- 您的應用程式元件和其他相依性 : NGen.exe 檔 涵蓋選擇哪些元件產生原生映射的一般準則,以及原生映射對安全性的影響、進階選項,例如「硬式系結」、在偵錯和分析案例中使用原生映射等案例等。
提示
請務必仔細測量在啟動效能和應用程式的整體效能上使用原生映射的影響,並將它們與實際需求進行比較。 雖然原生映射通常有助於改善啟動效能,但在某些情況下會減少記憶體使用量,並非所有案例都同樣受益。 例如,在穩定狀態執行時,JIT 編譯程式所產生的所有方法一旦至少叫用過一次,實際上會產生比原生映射稍微更好的效能。
在開發機器中使用 NGen.exe
在開發期間,.NET JIT 編譯程式將為經常變更的程式碼提供最佳整體取捨。 為已編譯的相依性產生原生映射,例如 EF 執行時間元件,可藉由在每次執行開始時縮短幾秒,協助加速開發和測試。
尋找 EF 執行時間元件的好位置是解決方案的 NuGet 套件位置。 例如,針對使用 EF 6.0.2 搭配 SQL Server 的應用程式,並以 .NET 4.5 或更新版本為目標,您可以在命令提示字元視窗中輸入下列內容(請記得以系統管理員身分開啟它):
cd <Solution directory>\packages\EntityFramework.6.0.2\lib\net45
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install EntityFramework.SqlServer.dll
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install EntityFramework.SqlServer.dll
注意
這會利用為 EF Provider for SQL Server 安裝原生映射的事實,預設也會安裝主要 EF 執行時間元件的原生映射。 這可運作,因為 NGen.exe 可以偵測到 EntityFramework.dll 是位於相同目錄中之 EntityFramework.SqlServer.dll 元件的直接相依性。
在安裝期間建立原生映射
WiX 工具組支援在安裝期間佇列產生 Managed 元件的原生映射,如本 操作指南 中所述。 另一個替代方法是建立執行 NGen.exe 命令的自訂安裝工作。
確認原生映射是否用於 EF
您可以尋找副檔名為 「.ni.dll」 或 「.ni.exe」 的已載入元件,以確認特定應用程式正在使用原生元件。 例如,EF 主要執行時間元件的原生映射稱為 EntityFramework.ni.dll。 檢查處理程式載入的 .NET 元件,最簡單的方式是使用 進程總 管。
要注意的其他事項
建立元件的原生映射不應與在 GAC (全域組件快取) 中 註冊元件混淆。 NGen.exe 允許建立不在 GAC 中的元件映射,事實上,使用特定 EF 版本的多個應用程式可以共用相同的原生映射。 雖然 Windows 8 可以自動為 GAC 中放置的元件建立原生映射,但 EF 執行時間已優化為與您的應用程式一起部署,我們不建議您在 GAC 中註冊,因為這會對元件解析和服務應用程式產生負面影響。