谈谈JIT编译器和本机影像生成器(NGen.exe)
前言
在看《CLR》的时候,作者在开篇的时候提到了NGen.exe,前面一节执行程序集的代码中提到:程序或方法执行前会执行MSCorEE.dll中的JIT函数把要执行方法的IL转换成本地的CPU指令,讲代码放在内存块中,第二次调用方法的时候,由于已对方法进行了验证和编译,所以会直接执行内存块中的代码,不需要再执行JIT函数编译了。因为在方法没调用之前都会要调用JIT函数编译,在这一节的最后作者也提到,通过实验表明,CLR的JIT编译器似乎没有使自己的应用程序达到应有的性能,然后就提到了.Net Framework SDK提供的NGen.exe工具。
疑问
当时看到这段话的时候很兴奋,然后就接着看作者写的NGen.exe的介绍,可惜作者只用了几页的篇幅讲了下,感觉太少了,也有些疑问,然后就在MSDN上搜,找到了《Ngen.exe(本机映像生成器)》,仔细看了下,和作者写的差不多,其中详细写了NGen.exe的用法,自己也照着上面的方法,自己敲了个遍,可能是官方写的太官方或是小弟理解能力有限,总有点云里雾里的,然后又在博客园找到了一位园友写的《本机影像生成器(Ngen.exe)工具使用实践》,仔细看了下,主要是NGen.exe项目的简单应用,不是很全面的介绍NGen.exe的用法。
结合上面所接触的,有几个疑问:
1,JIT编译器的执行条件
上面那位博文的作者在文章中提到
但是《CLR》这本书的作者在写执行程序集中的代码这一节中提到:JIT编译器将本地CPU指令存储到动态内存中。一旦应用程序终止,编译好的代码也会被丢弃。所以再次运行应用程序,JIT编译器必须再次将IL代码编译成本地指令。
就是说程序终止,再次运行程序还是会执行JIT编译器的。但是与上面“实时编译只在程序第一次运行时编译”有点矛盾。
2,NGen.exe的作用
MSDN和《CLR》的作者都说了NGen.exe的作用有两点,改善内存使用情况和更快的应用程序启动速度,这里我只说使应用程序启动速度加快。
NGen.exe操作会把相应的程序集的IL代码编译成本地代码,放到磁盘的某一目录下,下次执行程序的时候CLR会检测是否存在对应程序集由NGen.exe生成的文件,若不存在执行JIT编译器编译,若存在跳过JIT编译器,JIT编译器执行的条件是在执行方法之前编译,这时候我就有点迷糊了,MSDN上写的是NGen.exe的作用是使应用程序启动的速度加快而不是程序运行的速度加快,就是说在程序运行的时候,如果调用某一方法,还是会执行JIT编译器的,就有点矛盾了。或者这样说JIT编译器是不是在程序启动的时候执行,执行所有代码的编译?如果是,那NGen.exe使程序启动的速度加快这个作用是对的,我个人感觉并不是这样,比较那么纳闷的是为什么没有使程序运行的速度加快,因为NGen.exe已经把相关的程序集编译好了,程序调用某一方法的时候就不需要再执行JIT编译器了,少了编译速度不是更快了?
3,NGen.exe安装程序集依赖项
MSDN中提到

但是我试了下并没有安装程序的依赖项
4,NGen.exe检测映像变化
或者不是NGen.exe检测,其他的方式暂时也没发现,如果是自己程序中的程序集发生变化可以通过程序来判断,但是外部的变化就不太好检测了,比如:
5,NGen.exe更新映像
MSDN提供了两种更新映像的方式,但是没有指定程序集更新,如果说程序集发生变化,就需要全部更新映像花费时间太长,下面的更新方式的说明不是很清楚,不知是不是自动检测映像变化更新。
后记
以上疑问,跪求大神指点。。。。
不知是用NGen.exe后会性能会优化多少,暂时没有找到相关的方法测试,有机会会好好测试下,想想NGen.exe的用武之地应该是大型的Winfrom项目,而且业务逻辑应该很复杂的那种,如果只是简单的程序,就没这个必要了。
谈谈JIT编译器和本机影像生成器(NGen.exe)的更多相关文章
- 五、CLR加载程序集代码时,JIT编译器对性能的产生的影响
1.CLR首次加载代码造成的性能损失 四.CLR执行程序集中代码介绍了CLR在首次执行一个类的时,会初始化一个内部结构,然后当目标方法被首次调用时,JITComplier函数(JIT编译器)会验证IL ...
- Ngen.exe和本机映像缓存
本机映像生成器创建托管程序集的本机映像,并且将该映像安装到本地计算机的本机映像缓存中.本机映像缓存是全局程序集缓存的保留区域.一旦您为某个程序集创建了本机映像,运行库在每次运行该程序集时就会自动使用该 ...
- 浅谈对JIT编译器的理解。
1. 什么是Just In Time编译器? Hot Spot 编译 当 JVM 执行代码时,它并不立即开始编译代码.这主要有两个原因: 首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编 ...
- NET基础课--JIT编译器如何工作1
1..Net运行时调用JIT编译器,用来把由C#编译器生成的IL指令编译成机器代码.这一任务在应用程序的运行期间是分步进行的.JIT并不是在程序一开始就编译整个应用程序,取而代之的是,CLR是一个函数 ...
- JIT编译器技术理解
参考链接: https://blog.csdn.net/liaodehong/article/details/51605457 https://www.cnblogs.com/insistence/p ...
- 深入浅出 JIT 编译器
转载 https://www.ibm.com/developerworks/cn/java/j-lo-just-in-time/ JIT 编译器在运行程序时有两种编译模式可以选择,并且其会在运行时决定 ...
- JIT编译器
深入理解Java Class文件格式(九) http://blog.csdn.net/zhangjg_blog/article/details/22432599 http://blog.csdn.ne ...
- 《Java性能权威指南》笔记----JIT编译器
概览 编译型语言(C++,Fortran等):运行程序前,需要用编译器将代码静态编译成CPU可执行的汇编码.汇编码针对特定的CPU. 优点:只需编译一次,且有足够的程序信息来优化汇编码.执行速度快: ...
- Java虚拟机解释器与JIT编译器
一.JAVA编译相关概念 1.动态编译(dynamic compilation)指的是“在运行时进行编译”:与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫 ...
随机推荐
- Tomcat7 配置 ssl
运行一个配置了ssl的项目时tomcat总是启动不成功,报错:“requires the APR/native library which is not available”,后来发现是找不到apr的 ...
- sql 更新列表中最老的一条数据
今天组长给个任务说要给摄像头触发一个列表.让缓存5条数据,每次摄像头触发更新一条,丢掉最老的一条数据.原来的update是直接更新掉一条,没带缓存的.然后搞了个sql语句,是这样的: UPDATE C ...
- python中__init__问题
python中安装目录中的Lib文件夹模块中的__init__.py文件(文件内容可以为空),用于标识此文件夹是一个模块 python编程中的__init__表示初始化
- ios设备中openGL所支持的最大纹理尺寸
这几天碰到一个在iphone4上显示图片未黑色矩形的bug,在其他机器上都正常 最后发现是图片打包尺寸的关系,iphone4无法读取2048以上大小的单个图片,所以其中的图片都显示成了黑色,希望对碰到 ...
- CSS垂直水平居中方法总结
在布局的时候经常能用到居中,在此总结一下 html结构: <div class="wrap"> <div class="content"> ...
- DAO模型
DAO模型 前面我们在使用JDBC时解决的都是一些很简单的问题,例如登录,注册等等,所以有些例直接把代码写在了main方法中.这种写法很容易出现代码臃肿,耦合度高,不能模块化开发等诸多弊端,特别是将来 ...
- JS图片上传预览
HTML部分: <img id="avatar" class="editable img-responsive" alt="头像" s ...
- 事务使用中如何避免误用分布式事务(System.Transactions.TransactionScope)
1:本地事务DbTransaction和分布式事务TransactionScope的区别: 1.1:System.Data.Common.DbTransaction: 本地事务:这个没什么好说了,就是 ...
- ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug
Microsoft最近发布了ASP.NET Identity 2,该版本支持双重认证.帐号锁定以及防伪印章功能,还增强了用户帐号和索引.此外新版本还包含一个改进的密码验证器并修复了一些bug. 借助于 ...
- (新年快乐)ABP理论学习之本地化(2016第一篇)
返回总目录 本篇目录 应用语言 本地化资源 获取本地化文本 扩展本地化资源 最佳实践 应用语言 一个应用至少有一种UI语言,许多应用不止有一种语言.ABP为应用提供了一个灵活的本地化系统. 第一件事情 ...