一、JITCompiler

如你所知,JIT(just-in-time或“即时”)编译器是CLR的重要组件,它的职责是将IL转换成本地cpu指令。

<<CLR via C#>>一书中在CLR的执行模型章节里有一副图形象介绍了一个方法(WriteLine)首次调用时发生的事情:

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

JITCompiler、NGen.exe及.NET Native的更多相关文章

  1. (转)JITComplier、NGen.exe及.NET Native

    一.JITComplier 如你所知,JIT(just-in-time或“即时”)编译器是CLR的重要组件,它的职责是将IL转换成本地cpu指令. <<CLR via C#>> ...

  2. c#程序打包、机器代码生成(Ngen.exe)

    深入本机影像生成器(Ngen.exe)工具使用方法详解 先介绍一点背景知识:.Net程序在运行时会实时(JIT)编译,将.Net程序文件编译成cpu认识的汇编机器码.实时编译需要消耗额外的cpu和内存 ...

  3. 谈谈JIT编译器和本机影像生成器(NGen.exe)

    前言 在看<CLR>的时候,作者在开篇的时候提到了NGen.exe,前面一节执行程序集的代码中提到:程序或方法执行前会执行MSCorEE.dll中的JIT函数把要执行方法的IL转换成本地的 ...

  4. [CLR via C#]1.5 本地代码生成器:NGen.exe

    原文:[CLR via C#]1.5 本地代码生成器:NGen.exe 1. NGen.exe工具,可以在一个程序安装到用户计算机时,将IL代码编译成为本地代码.由于代码在安装时已经编译好,所以CLR ...

  5. Ngen.exe和本机映像缓存

    本机映像生成器创建托管程序集的本机映像,并且将该映像安装到本地计算机的本机映像缓存中.本机映像缓存是全局程序集缓存的保留区域.一旦您为某个程序集创建了本机映像,运行库在每次运行该程序集时就会自动使用该 ...

  6. .Net Framework 工具Mpgo.exe与Ngen.exe

    首先放出官方MSDN的文档地址 Mpgo.exe 主要用于分析程序集启动时需要哪些东西,然后将信息反馈给NGen.exe 来更好的优化本机映像,使得应用程序启动更快,工作集缩小.准备发布时,用MPGO ...

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

    先科普一下,.Net是一个用于Windows的托管代码模型,用于高效构建具有视觉上引人注目的用户体验的应用程序.但这个模型生成的代码并非可执行代码,而是由.Net公共语言运行库环境执行的IL代码.所以 ...

  8. Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

    文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...

  9. 【转】Gacutil.exe(全局程序集缓存工具)

    全局程序集缓存工具使您可以查看和操作全局程序集缓存和下载缓存的内容. 安装 Visual Studio 和 Windows SDK 时会自动安装此工具. 要运行工具,我们建议您使用 Visual St ...

随机推荐

  1. mac 10.11.6,Xcode8下,ruby2.3安装,Cocoapods安装~

    适用环境 mac: 10.11.6 Xcode:8.1 命令执行步骤(安装ruby2.3前准备工作) 查看ruby更新源 gem sources  -L 删除默认官方或者淘宝,新增 https://g ...

  2. vpn速度太慢?先从本地网络着手

    使用VPN,用户们抱怨的最多的是速度太慢这个问题,导致网页打不开或者打开缓慢,游戏延迟变高或者根本无法游戏,甚至无法连接等.那么我们今天就来全面解析下VPN的速度是由什么因素引起的. vpn速度过慢 ...

  3. ZOJ3792_Romantic Value

    给出图,使得两点无流量,剩余其他边的总容量与删除边数的比值. 要机智啊... 因为原图给的边数不超过1000,容量也不超过1000,可以这样把边的容量变为2000*c+1.这样跑出最大流后,最大流除以 ...

  4. android json解析详细介绍之gson

    废话不多说,什么json是轻量级数据交换标准:自己百度去深入了解:这里有三种json解析工具.本人只用过其中两种:    1.Google Json利器之Gson   评价:简单,方便. 2.阿里巴巴 ...

  5. BZOJ1742[Usaco2005 nov]Grazing on the Run

    Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...

  6. The Singleton pattern

    作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一 ...

  7. PowerPoint

    工具/原料 PowerPoint 2007 百度经验:jingyan.baidu.com 一.PowerPoint2007基础知识 1 桌面快捷方式:也可以“开始”菜单→程序→Microsoft Of ...

  8. 关于“线程间操作无效: 从不是创建控件’textBox1‘的线程访问它”异常的解决方法

    线程间操作无效: 从不是创建控件“textBox1”的线程访问它 背景:通过一个辅助线程计算出的一个值赋给textBox1.text;解决办法:1.直接在窗体的构造函数中加:System.Window ...

  9. 我的iOS之路2

    第一篇果然没人看呢...好吧...那就当笔记做吧...第一篇主要写的是生成了一个helloworld,可能也是和别人撞了,所以有点厌烦,连名字都改掉吧 好,开始写第二篇 之前做第一个应用程序的时候没有 ...

  10. Kernel Functions for Machine Learning Applications

    In recent years, Kernel methods have received major attention, particularly due to the increased pop ...