JITCompiler、NGen.exe及.NET Native


一、JITCompiler

如你所知,JIT(just-in-time或“即時”)編譯器是CLR的重要組件,它的職責是將IL轉換成本地cpu指令。

<<CLR via C#>>一書中在CLR的執行模型章節里有一副圖形象介紹了一個方法(WriteLine)首次調用時發生的事情:

JITComplier

JITCompiler函數被調用時,它知道要調用的是哪個方法,以及具體是什么類型定義了該方法。然后,JITCompiler會在定義該類型的程序集的元數據中查找被調用的方法的IL,接着JITCompiler驗證IL代碼,並最終將IL代碼翻譯成本地CPU指令。本地CPU指令被保存到一個動態分配的內存塊中。

這里再插播一下MSIL。我們知道,.NET托管程序集同時包括元數據和IL。IL是與CPU無關的機器語言,可將它視為一種面向對象的機器指令,或者理解為一種高級匯編語言,但它比大多數CPU機器語言高級。IL能訪問和操作對象類型,並提供了指令來創建和初始化對象、調用對象上的虛方法以及直接操作數組元素,甚至提供了拋出和捕獲異常的指令來實現錯誤處理。

一個已經被JITCompiler驗證和編譯過的方法,第二次調用時會直接執行內存塊中的代碼,完全跳過JITCompiler函數,所以說一個方法只有在首次調用時才會造成一些性能損失。

JITCompiler的主要特點:

1、運行時編譯;

2、每次編譯需要的方法;

3、編譯后存在內存中;

4、編譯器生成的代碼會綁定到觸發編譯的進程上,不能多進程間共享。

 

二、NGen.exe

.NET Framework提供了NGen.exe工具,即本地代碼生成器或本機映像生成器,可以在一個應用程序安裝到用戶的計算機上時,將IL代碼編譯成本地代碼。

由於代碼在安裝時已經編譯好,所以CLR的JITCompiler不需要在運行時編譯IL代碼,這樣看上去有助於提升應用程序的性能。

為什么說是“看上去”有助於提升應用程序的性能呢?NGen.exe不能提高.NET應用程序性能嗎?你看,NGen.exe可以減少JITCompiler的驗證和編譯,這部分開銷難道不是省掉了嗎?

實際上NGen.exe僅僅是加快應用程序的啟動速度,執行時的性能並不比JITCompiler編譯的代碼快。主要原因是,編譯代碼時, NGen無法像JIT編譯器那樣對最終的執行環境作出許多假設,這會造成NGen.exe產生較差的代碼。例如, NGen不能優化一些CPU指令, 對靜態字段的訪問需要間接的操作而不能直接訪問,因為靜態字段實際的地址需要在運行時刻才能知道。NGen到處插入代碼來調用類的構造函數,因為它不知道代碼執行的次序,不知道類的構造函數是否已經被調用。

NGen.exe的主要特點:

1、在運行前編譯;

2、一次編譯整個程序集;

3、編譯后持久地存儲在本地的磁盤上;

4、可以多進程間共享已經編譯好的代碼。

當然,NGen.exe生成的文件也有一些典型的問題,比如沒有知識產權保護、文件可能失去同步、難以管理、較差的執行時性能等,具體大家可以參考To-NGen-or-Not-to-NGen

可以通過命令行調用Framework下的NGen.exe工具,它的具體參數可以參考MSDN

三、.NET Native

最近這兩天在博客和微博上都是熱點。起因源自於微軟在 MSDN 博客上宣布了 .NET Native 的開發者預覽版。.NET Native 可以將 C# 代碼編譯成本地機器碼。有了它,開發者將不僅能享受 C# 的高生產力,而且能擁有 C/C++般的性能。魚與熊掌不可兼得,而有了 NET Native,我們可以兼得 C# 的生產力與 C++ 的戰斗力。

看來MS這回是鐵了心走高大上的道路了,功能和性能,效率和體驗,平台和開源,一個都不能少。

 

參考:

<<CLR via C#>>

http://www.cnblogs.com/flier/archive/2004/07/08/22340.html

http://www.codeguru.com/csharp/.net/net_general/toolsand3rdparty/article.php/c4651/JIT-Compilation-and-Performance--To-NGen-or-Not-to-NGen.htm

http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx

http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM