首页 技术 正文
技术 2022年11月15日
0 收藏 960 点赞 4,660 浏览 1381 个字

在了解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指令

CLR Via第一 章 知识点整理(3)CLR执行程序集的IL代码

至此一个方法调用的全部流程就走完了,如果不终止程序(终止会将编译好的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) –> 有优化

CLR Via第一 章 知识点整理(3)CLR执行程序集的IL代码

虽然编译器在优化代码的过程中会占用额外的时间和内存,但是在实际运行阶段所带来的收益远远大于这些牺牲,并且性能上远远大于非托管代码,例如:
  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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,037
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,522
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,370
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,151
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,784
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,866