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   /?   可以看到其它参数  

posted @ 2013-11-27 11:08  Bonker  阅读(1986)  评论(0编辑  收藏  举报