天天看點

Ngen.exe和本機映像緩存

 本機映像生成器建立托管程式集的本機映像,并且将該映像安裝到本地計算機的本機映像緩存中。本機映像緩存是全局程式集緩存的保留區域。一旦您為某個程式集建立了本機映像,運作庫在每次運作該程式集時就會自動使用該本機映像。不必執行任何其他的過程就可使運作庫使用本機映像。在程式集上運作Ngen.exe 可以提高程式集的加載和執行速度,原因是它可以從本機映像緩存中還原代碼和資料結構,而不是動态生成它們。 

       問:C#寫的程式能編譯成本機代碼嗎?  

       答:可以,使用Ngen.exe即可以MSIL代碼編譯為本機代碼。  

       這樣回答錯了嗎?其實,嚴格的說,這個回答是沒錯的,Ngen.exe的确是可以将MSIL 編譯為本機代碼,并可以使JIT不需要進行再次編譯MSIL。這樣能加快程式的執行效率。  

       但使用者這樣的問題其實,并不是對執行效率不滿意,而是對中間語言不滿意,可惜   Ngen   并不能解決使用者的問題。  

       讓我們來淺淺的分析一下Ngen的工作吧。  

       Ngen是MS提供的本機映象生成器,它可以将中間語言程式集編譯為本機代碼存放在緩存中。這裡請大家注意,是存放在緩存中,Dotnet在記憶體中建立了一個緩存,這個緩存中存放了許多常用的程式集編譯後的本機代碼,它們是常駐的,由此來加快Dotnet的執行速度。  

       所謂一個本機代碼,因為本機映射時,會映射出一些 Framework裡需要的Method,編譯為彙編就是Call   0x0200000這樣的樣子,而這些東西必須是事件編譯好的。那麼理論上說Ngen必須要在目前執行的機器上運作,而直接編譯成本機代碼的程式copy到另一個地方不一定可以用,而且我一直沒有找到能将緩存中的本機代碼copy出來的方法。  

      講到這裡,不知道大家明白我的意思沒有,不管如何Ngen.exe隻是一個提速的工具,因為要執行編譯為本機代碼必須還是要原程式集,而原程式集中存在MSIL,是以讓程式無法脫離被反編譯的目地。  

      如果有空,您可以做做試驗。  

      Ngen   /show   就可以看到緩存中所有的已編譯好的程式集,是以Dotnet并不慢。  

      Ngen   <assembly   path   or   display   name>   可以把指定程式集映象為本機代碼。  

      Ngen   /?   可以看到其它參數  

QQ:519841366

本頁版權歸作者和部落格園所有,歡迎轉載,但未經作者同意必須保留此段聲明,

且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利