Ngen生成Native代码实战及优缺点分析

先科普一下,.Net是一个用于Windows的托管代码模型,用于高效构建具有视觉上引人注目的用户体验的应用程序。但这个模型生成的代码并非可执行代码,而是由.Net公共语言运行库环境执行的IL代码。所以,每次执行代码时,都会由.Net将IL代码翻译为机器代码。所以,效率上自然会受到一定影响。对此,微软在.Net中附带一个将IL代码转换为Native代码的工具Ngen.exe。它可以创建一份程序集文件至类似于C:\WINDOWS\assembly\NativeImages_v4.0.30319_32的文件夹内。这个文件夹下通常会包含如下信息:

1.公共语言运行库的版本

2.x64版本或x86版本信息(包括x86,x64和Itaninum)

3.Native代码

如果这样一个Ngen程序集被创建了(暂且这么叫它),那么,CLR载入程序集文件时,就不会实时编译,而会使用Ngen程序集中的代码,于是,应用程序集的启动速度、运行速度都得到了提升。

看起来很美好,是吧(哪种技术听起来不美好…)?既得到了托管代码的所有优点,还得到了近似于普通非托管代码的执行性能我们先来分析一下它的优缺点:

Advantage:1.提高启动速度, 因为代码已经编译成Native代码, 所以在运行时就不需要编译了。

2.减少应用程序的工作集,如果一个程序集会被同时载入到多个进程/Appdomain,,在这个程序集上运行Ngen能减少应用程序的工作集。因为Ngen会将IL编译为Native代码后,保存到单独的文件夹。这个文件夹能在同一时刻对多个进程空间起作用,且允许代码共享。所以, 每个进程/AppDomain不必为自己拷贝一份代码。

Disadvantage:1.编译Native代码后,原IL代码不可删除。因为运行的时候,CLR需要访问程序集的metadata,这需要IL与Native两者。且很多人认为发布Native代码就可以避免IL原始代码泄露,以保护知识产权,其实这是错的。

2.NGen文件可能会过时: 当CLR载入NGen所映射文件时,,它会比较以前编译的代码和当前的执行环境的很多特征, 如果任何特征不匹配,预编译的文件就不能被使用, JIT编译器进程就要使用。下面必须被匹配的部分特征列表:

① 程序集模块的版本ID (MVID)

② 被引用的程序集的版本ID

③ 处理器类型

④ CLR版本

⑤ Build类型(release, debug, optimized debug, profiling, 等等)

若预编译程序集过时,可以以升级的方式运行Ngen.exe来补救, 这告诉工具对以前曾经被执行Ngen操作的所有的程序集上运行Ngen。当终端用户安装.NET Framework的一个新service pack,,那么service pack的安装程序将会在更新模式下自动运行Ngen.exe, 使得NGen文件保持和CLR的版本一致。

4. 较差的载入时性能(重定位/绑定): 程序集文件仍是标准的Windows PE文件, 每个文件包含着一个优先使用的基地址。 CLR会对于内存地址进行计算,导致额外的性能消耗。然而, Ngen程序集文件的一些内存地址引用是静态计算的, 当Windows加载一个Ngen文件时, 它检查文件是否被载入到优先的基地址上, 如果文件没有载入到优先的基地址, Windows会重新定位文件, 修改所有内存地址引用。这是极其耗时的, 因为Windows必须载入整个文件, 并修改文件中的很多字节. 此外, 这个页面文件对应的代码不能跨进程边界共享。

5. 较差的执行时性能: 当编译代码时, Ngen对执行环境做出的假设不会比JIT编译器的多, 这会造成Ngen产生较保守的代码, 例如, Ngen不能优化一些CPU指令。 Ngen到处插入代码来调用类的构造函数, 因为它不知道代码执行的次序, 不知道类的构造函数是否已经被调用了。 一些Ngen应用程序反而会比JIT编译的代码慢大约5%, 因此, 如果你打算使用Ngen来提高应用程序的性能, 你应该对比Ngen和非Ngen版本的应用程序, 确定Ngen版本在实际执行时并不慢。 对于一些应用程序, 减小的工作集大小会提高性能, 因此Ngen总体上还是会取胜。

Ngen的利弊,需要大家自己去权衡,但对于客户端应用程序,Ngen会对于提高启动速度或者减小工作集有帮助。此外,如果Ngen被用于所有的客户端应用程序的程序集, 那么CLR就根本不需要载入JIT编译器, 从而更进一步地降低了工作集. 当然, 如果只有一个程序集不是Ngen所创建或者如果一个程序集的Ngen文件不能被使用, JIT编译器就会被载入, 应用程序的工作集将会增加。

如何使用Ngen呢?很简单我们只需要两个命令就可以玩转它,这两个命令是

Ngen install filepath

Ngen uninstall filepath

当我们想创建一份Ngen程序集时,只要按如下步骤做:假设E盘内有一个WindowsFormsApp.exe文件,它属于WindowsFormsApp工作集。打开命令提示符,输入“cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319”(目录因Windows、.Net版本而异),回车。再输入“Ngen install e:\WindowsFormsApp”,回车。这样,一份Ngen工作集就在本地创建完成了。当然想卸载它,只要输入“Ngen uninstall e:\WindowsFormsApp”,回车即可。

当然,这只是本地Ngen工作集,要在客户机上创建,必须要在安装软件中加入Ngen代码。

时间: 2024-12-27 04:55:01

Ngen生成Native代码实战及优缺点分析的相关文章

结对编程——队友代码的优缺点分析

一·项目的需求分析 需求文档中给出5个需求,第一个是用户的登录要求用户名和密码相匹配,并且有着初始的出题类型:需求二则限制题目的操作数和取值范围: 需求三要求我们输入题目数量,这里给出限定条件10-30个题目并且要求同一位老师的题目不能一样:需求四则要我们满足切换出题类型:需求五则 是对题目保存路径和文件的要求. 二·代码优缺点分析 main函数大体框架为:一个循环加一个if的判断语句来确定登陆对象,并且每一个登录对象都有一个唯一的标识,eg:张三1的标识为(0,1),再将其标 识传递给user

Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池) 以上就是Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池)的全部内容了,更多内容请关注:CPP学习网_CPP大学 本文固定链接:CPP学习网_CPP大学-Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.

20155326《网络对抗》免考项目——深入恶意代码之生成恶意代码的动静态结合分析

20155326<网络对抗>免考项目--深入恶意代码之生成恶意代码的动静态结合分析 在前两篇博客中,我分别学习了利用静态分析工具和动态分析功具对恶意代码进行分析,在这篇博客中,我将之前学到的知识结合起来,对恶意代码示例进行更深层次的动静态分析. 并且,我学习了使用IDA PRO和OllyDbg对恶意代码进行进一步细化的动态分析,查看恶意代码中主要函数之间的关系以及函数之间的参数,以此来搞清楚恶意代码在运行后对计算机进行了哪些操作. IDA Pro介绍 IDA Pro交互式反汇编器专业版(Int

ASP.NET常用数据绑定控件优缺点分析总结

ASP.NET常用数据绑定控件优缺点分析总结 本文的初衷在于对Asp.net常用数据绑定控件进行一个概览性的总结,主要分析各种数据绑定控件各自的优缺点,以便在实际的开发中选用合适的控件进行数据绑定,以提高开发效率. 因为这些数据绑定控件大部分都已经封装的很好了,稍微有一些基础的朋友都可以很容易的上手使用,所以本文不涉及具体控件的使用,只在于分析各自的优劣点,但是在下一篇文章里,我会主要讲一下ListBox.GridView.Repeater这三个数据绑定控件的“高效分页”,ListBox和Gri

【腾讯Bugly干货分享】React Native项目实战总结

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 "8小时内拼工作,8小时外拼成长"这是大家共同的理想.除了每天忙于工作外,我们都希望能更多地区吸收领域内的新知识与新技能,从而走向人生巅峰. Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师.每周都会举行嘉宾分享,话题讨论等活动. 上一期我们邀请了腾讯SNG工程师&qu

试卷生成程序优缺点分析

·程序说明 队友的个人项目完成了项目的所有功能要求. 他使用了如下函数来实现需求: void kuohao(int B[] ,int numA);         //预定公式在括号中的位置 string Pschooltext(int A[],int numA);     //生成一条小学的试题 string Jschooltext(int A[],int numA);     //生成一条初中的试题 string Sschool(int A[],int numA);        //生成一

Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机

文章目录 1. 开箱即用,内藏玄机 2. 总结 3. 源代码 Spring Boot提供了很多"开箱即用"的依赖模块,那么,Spring Boot 如何巧妙的做到开箱即用,自动配置的呢? 开箱即用,内藏玄机 Spring Boot提供了很多"开箱即用"的依赖模块,都是以spring-boot-starter-xx作为命名的.例如,之前提到的 spring-boot-starter-redis.spring-boot-starter-data-mongodb.spri

android 原生应用、Web应用、混合应用优缺点分析

最近开发几个项目,牵涉到android的几种开发模式.对于原生态开发.web 应用开发以及混合模式开发,本人认为并不是哪一种就是最好的,哪一种就是最差的,这个完全是根据自己的需求,选择一种合适的开发模式.他们同时具备自己的有点,同时也有自身的缺点,我们根据实际情况,取其中的优点,尽量避免掉缺点,才是最好的开发模式.下面,我们就一同看看,这三种开发模式,到底有什么区别. 一.原生应用 (也称本地开发 Native App) 你使用过微软PowerPoint 或者 Word吧?这些可直接在你电脑上运

Android -- Audio Native服务之启动流程分析(一)

Android -- Audio Native服务之启动流程分析(一) Android中的Audio系统是比较庞大.繁杂的一部分内容, 其中会涉及较多的音频编解码.多媒体制式与Android Audio HAL设备管理的知识.随着Android的发展,其所支持的音频设备也变得越来丰富,如扬声器.耳机.听筒等等:这种变化也为Android管理如此丰富的音频设备以及如何正确.合理地切换音频输出提出了更高的要求.面对如此繁杂的管理要求,我们分析Android Audio服务的历程想必也不会轻松.接下来