CLR Via第一 章 知识点整理(3)CLR执行程序集的IL代码
在了解CLR运行之前让我们先简单了解一下IL
除了编译器编译的IL代码,IL也是一种汇编语言,也就是说我们可以直接编写IL代码,当然也有对应的IL编译器,值得一提的是对于面向CLR的其他语言,
CLR只开放了一部分功能,而IL可以访问CLR的全部功能。
前面一章我们介绍了CLR的所有初始工作,最后在调用Main入口方法的时候,CLR需要将程序集中的IL代码转为CPU指令,也就是CLR中JIT(just-in-time)
编译器的职责,CLR会即时编译IL代码
即时编译:在运行的时候才会进行编译(类似懒加载)
当CLR运行并调用方法时做了如下几件事情
1、检测出所有方法中所有被引用的类型,并创建一个内部数据结构进行管理,每个类型的方法都会记录指向名为JITComplier函数的地址,
2、在方法被调用的时候,函数会在与元数据中查找被调用的方法对应的IL代码,对其验证并将代码编译成CPU指令
3、将CPU指令存贮到动态分配的内存中
4、回到内部数据结构中,修改对应方法记录的地址,指向刚才编译好的CPU指令的地址
5、最后函数会回到内存当中去运行CPU指令
至此一个方法调用的全部流程就走完了,如果不终止程序(终止会将编译好的cpu指令丢弃),那么CLR在第二次调用方法时,直接在数据
结构中找到对应的内存运行CPU指令,省去了上面的2、3、4步骤
CLR的JIT编译器以及C#编译器对本机代码的优化
C#编译器 :
/optimize 关闭 --> 编译出的IL代码会包含许多NOP指令(no-operation 空操作)和跳转执行,vs就是利用的这些指令提供了调试的功能
/optimize 开启 --> 优化后的代码会更小,程序集也会相应变小,更方便阅读IL代码(一般估计不会有人去直接阅读IL查找问题吧)
JIT编译器:
在 /optimize 关闭 的情况下:
/debug - 关闭(默认) --> 有优化
/debug (+/full/pdbonly) --> 未优化:编译器会生成PDB文件帮助编译器查找到局部变量并将IL代码映射到源代码方便调试,如果指定的是
/debug : full 开关,编译器还会记录每一条IL指令生成的本机指令,但会使用额外的时间和内存
在 /optimize 开启的情况下:
/debug (-/+/full/pdbonly) --> 有优化
虽然编译器在优化代码的过程中会占用额外的时间和内存,但是在实际运行阶段所带来的收益远远大于这些牺牲,并且性能上远远大于非托管代码,例如:
1、JIT编译器针对不同的CPU优化本机代码
2、会根据机器对特定的判断进行代码优化
3、CLR会根据运行状态对代码评估并重新编译(还未实现)
最后再来简单了解一下NGen.exe工具
NGen.exe是.net framework提供的工具,它可以将代码提前编译好,这样JIT编译器不需要在运行是编译提升性能,但其实这个工具并不是很实用
1、因为NGen无法对代码进行最优的优化 --> 因为无法确定CPU
2、对服务器提升不明显 --> 因为只是在第一次运行时有帮助,后面运行的时间时相等的
3、可能失去同步 --> 如果当前代码与执行环境不符合,那么就会从新用JIT编译
至此关于CLR如何与程序集工作就完成了,下一节我们将介绍.net Framework的Framework 类库以及CTS CLS
CLR Via第一 章 知识点整理(3)CLR执行程序集的IL代码的更多相关文章
- CLR Via第一 章 知识点整理(4) FCL、CTS、CLI和CLS
FCL(Framework Class Library) Framework 类库: FCL是 .net Framework 包含的一组DLL程序集的统称,FCL包含了提供了很多功能,关于这一部分没有 ...
- CLR Via 第一 章 知识点整理(1)
写这个纯粹是自己的一点学习总结,其实就学习的笔记整理,相当于对自己的一点督促,如有看到不正确的欢迎指出 一般我们写代码都是使用的高级语言,但是在CLR中运行的代码并不是我们直接写的代码,而是通过我们选 ...
- CLR Via 第一 章 知识点整理(2)程序集和CLR的启动
这一节先简单的讨论一下程序集以及CLR的初始化 虽然对应的编译器会生成托管模块,但实际上CLR不与托管模块工作,编译器除了编译还有将生成的托管模块转换为程序集的功能,微软还提供了工具AL.exe(程序 ...
- 《零压力学Python》 之 第一章知识点归纳
第一章(初识Python)知识点归纳 Python是从ABC语言衍生而来的 ABC语言是Guido参与设计的一种教学语言,为非专业编程人员所开发的. Python是荷兰程序员 Guido Van Ro ...
- [CLR via C#读后整理]-1.CLR的执行模型
公共语言运行时(Common Language Runtime,CLR)是一个可由多种编程语言使用的"运行时".他主要提供的功能有:程序集加载,内存管理,,安全性,异常处理,线程同 ...
- Java入门第一章知识点总结
-d是directory 目录的意思 cls:清楚doc里面的内容 ipconfig:显示网络配置信息 java -version:检查安装的jdk版本信息 是类型自动向上转换. 在输出时,根据当前 ...
- 第一章:开始启程-你的第一行Android代码
Android 系统为开发者提供了什么? 四大组件 活动(Activity):界面 服务(Service):后台默默运行 广播接收器(Broadcast Receiver):接收.发送广播消息 内容提 ...
- 第一章 CLR的执行模型
编译器将源代码编译为托管模块.托管木块包含: PE32或PE32+头 CLR头 元数据 IL(中间语言)代码 PE32头的文件可在32或64位的电脑上运行,PE32+的只能在64上运行.Window6 ...
- Artech的MVC4框架学习——第一章初步认识ASP.NET MVC
前言: Artech觉得掌握ASP.NET MVC具有三个层次. 第一层了解基本的编程模式,掌握Controller和View的定义方式,知道路由如何注册以及验证规则如何定义. 第二个层次要求我们对A ...
随机推荐
- 参数FAST_START_MTTR_TARGET的理解
本文来源:keeptrying <参数FAST_START_MTTR_TARGET的理解> 参数FAST_START_MTTR_TARGET的理解 一.FAST_START_MTTR_T ...
- 以resnet作为前置网络的ssd目标提取检测
http://blog.csdn.net/zhangjunbob/article/details/53119959
- 10,关于在vs2017中的netcore项目使用BundlerMinifier 配置问题
查阅资料 https://github.com/madskristensen/BundlerMinifier/issues/230 今天下载了vs2017 rc 创建了个netcore的web项目,突 ...
- NIO(三)
使用直接缓冲区完成文件的复制(内存映射文件) package com.cppdy.nio; import java.nio.MappedByteBuffer; import java.nio.chan ...
- laravel 表单方法伪造
有时候,我们可能需要手动定义发送表单数据所使用的 HTTP 请求方式,而 HTML 表单仅支持 GET 和 POST 两种方式,如果要使用其他的方式,则需要自己来定义实现. HTTP 请求方式概述 最 ...
- hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
这题用直接枚举是超时的,必须要用搜索来搜索出所有可能的状态,然后再进行枚举 这是较慢的做法 /* 方格取数,相邻格子的数不可取,问最多取到的和是什么 有点类似炮兵布阵,先打出所有可能的状态,然后dp[ ...
- 一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)
Hive官网(HQL)语法手册(英文版):https://cwiki.apache.org/confluence/display/Hive/LanguageManual Hive的数据存储 1.Hiv ...
- Elasticsearch索引模板和别名
创建模板(模板名和索引名一样都不能有大写) PUT http://222.108.x.x:9200/_template/templateds { "template": " ...
- [转] JavaScript设计模式之发布-订阅模式(观察者模式)-Part1
<JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...
- mysql8.0.11绿色版安装教程
解压到安装目录 在根目录建立data文件夹 建立my.ini文件 代码如下 # Other default tuning values # MySQL Server Instance Configur ...