JIT和程序的首次执行
由于C#源代码经过编译器编译生成的是IL代码,而IL是与CPU无关的机器语言。因此当程序运行于特定的CPU时,首先必须将IL转换成本地CPU指令,这正是JIT(Just-In-Time)编译器的任务、职责。
当程序中某个具体的方法首次被调用的时候,JIT主要会执行以下步骤:
- 找到该方法的IL
 - 将IL编译成优化过的本地CPU指令并保存到一个动态分配的内存中
 - 执行生成的本地指令并返回
 
由于第一次调用会经过编译和优化等步骤,所以会有一定的性能损失。但是以后对该方法的调用会以本地代码的形式全速运行。
如果您认为这些性能损失不容忽视,可以使用NGen.exe工具来将应用程序的IL代码编译成本地代码。然后,每当CLR加载程序集时,都会检查是否存在一个对应的、由于NGen生成的本地文件。如果找不到,CLR就会像往常一样对IL进行JIT编译。然而,如果存在一个对应的本地文件,CLR直接使用本地文件中编译好的代码。但是对于服务器应用程序而言,NGen.exe的作用并不明显,有时甚至毫无用处,加上NGen.exe有一些其他的缺点,因此应当谨慎使用!
JIT和程序的首次执行的更多相关文章
- Java 程序是如何执行的
		
Java 程序是如何执行的 了解任何一门语言的精髓都是先俯览其全貌,从宏观的视角把握全局,然后再深入每个知识点逐个击破,这样就可以深入而快速的掌握一项技能.同样学习 Java 也是如此,本节就让我们先 ...
 - CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
		
这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...
 - 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...
		
出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...
 - 检测到 LoaderLock:DLL"XXXX"正试图在OS加载程序锁内执行
		
解决方法: ctrl+D+E或alt+ctl+e或使用菜单调试——>异常——>异常窗口——>Managed Debugging Assistants——>去掉LoaderLoc ...
 - 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
		
来自:http://www.cnblogs.com/lcxu2/archive/2011/01/16/2004016.html 正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或 ...
 - 正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。
		
出错提示: 正尝试在 OS 载入程序锁内执行托管代码. 不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中添加了42种非常强大的调试助 ...
 - 一个简单的mfc单页界面文件读写程序(MFC 程序入口和执行流程)
		
参考:MFC 程序入口和执行流程 http://www.cnblogs.com/liuweilinlin/archive/2012/08/16/2643272.html 程序MFCFlie ...
 - MFC 程序入口和执行流程
		
MFC(微软基础类库)以C++类的形式封装了Windows API,给开发者提供了便利,但是初学者常常会疑惑MFC程序的入口在哪里?下面给大家简单介绍一下MFC 程序入口和执行流程. 一 MFC程序执 ...
 - 在AE二次开发中出“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”异常解决方案
		
今天的一个项目总用到了AE的开发组件,也就是ESRI公司提供的一系列的开发包(组件)都是以dll(动态链接库的形式)然后今天在调试的时候却出现了“正试图在 OS 加载程序锁内执行托管代码.不要尝试在 ...
 
随机推荐
- mysql-test库要命的地方
			
为了见识test库对整个mysql实例安全的影响,我将建立一个appuser@'%' 用户,它只有一个权限那就是可以连接上mysql. 001. 以高权限用户登录mysql.创建一个appuser@' ...
 - canvas arcTo()用法详解 – CodePlayer
			
canvas arcTo()用法详解 – CodePlayer canvas arcTo()用法详解
 - poj 3301 Texas Trip(几何+三分)
			
Description After a day trip with his friend Dick, Harry noticed a strange pattern of tiny holes in ...
 - java各公司笔试题集1
			
IBM笔试题 注:IBM笔试题一小时之内完成,题目全部用英文描述,这里用中文表述 一.名词解释 1.Eclipse 2.J2EE 3.EJB 4.Ajax 5.Web service 二.找出以下代码 ...
 - Android应用程序中的多个Activity的显示创建和调用
			
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTkzNjE0Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
 - hdu1106 字符串水题strtok()&&strchr()&&sscanf()+atoi()使用
			
字符串的题目 用库函数往往能大大简化代码量 以hdu1106为例 函数介绍 strtok() 原型: char *strtok(char s[], const char *delim); 功能: 分解 ...
 - 一、MP3文件概述
			
一.概述 MP3 文件是由帧(frame)构成的,帧是 MP3 文件最小的组成单位.MP3 的全称应为 MPEG1 Layer-3 音频文件,MPEG(Moving Picture Experts G ...
 - 全分布式环境下,DataNode不启动的问题解决
			
问题出现:机器重启之后,再次在master结点上面执行start-all.sh,发现有一个datanode没有启动,通过jps检查之后,发现slave1上面的datanode进程未启动 原因:每次na ...
 - SQL语句函数详解__sql聚合函数
			
函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类:单行函数.组函数 本文将讨论如何使用单行函数及 ...
 - OC——动态添加Button和监听UIAlertView按钮
			
1:动态添加uibutton - (IBAction)addButton:(id)sender { CGRect frame = CGRectMake(90, 200, 200, 60); UIBut ...