摘要:在了解运行之前让我们先简单了解一下除了编译器编译的代码,也是一种汇编语言,也就是说我们可以直接编写代码,当然也有对应的编译器,值得一提的是对于面向的其他语言,只开放了一部分功能,而可以访问的全部功能。
在了解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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/110545.html
摘要:这一节先简单的讨论一下程序集以及的初始化虽然对应的编译器会生成托管模块,但实际上不与托管模块工作,编译器除了编译还有将生成的托管模块转换为程序集的功能,微软还提供了工具程序集链接器。 这一节先简单的讨论一下程序集以及CLR的初始化 虽然对应的编译器会生成托管模块,但实际上CLR不与托管模块工作,编译器除了编译还有将生成的托管模块转换为程序集的功能,微软还提供了工具AL.exe(程序集链...
摘要:是一个语言,微软给它定制了一份语言规范,提供了从开发编译部署执行的完整的一条龙的服务,每隔一段时间会发布一份最新的规范,添加一些新的语言特性。通常我们把,再加上微软提供的一套基础类库称为。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 从编译原理说起 虚拟机是什么 C# 是什么,IL 又是什么 .Net Framework vs Mo...
摘要:充分理解和内部细节,设计和开发高性能的应用程序,解决因性能引起的问题。例如内存管理由垃圾收集器推进工作是一个极其复杂的领域,并且会引起巨大的性能问题如内存泄露和长时间暂停。 英文版 .Net Performance 作者 Sasha Goldshtein,Dima Zurbalev,Ido Flatow 目录 前言关于作者关于审计员鸣谢本书介绍 第一章:性能评定标准 第二章:性能测试...
摘要:故而性能优化是每一位运维软件开发人员必须掌握的技术。针对这一需求,提供给编写者两种实现方式栈快照和倒影栈。需要注意,仅支持对栈上托管函数的追踪。频繁使用栈快照会为带来过多的额外性能损耗。如此,即可低消耗地进行栈追踪操作。 众所周知,性能问题是所有实用应用在迭代过程中必然要面对的问题。对于此类问题,简单地投入更多硬件资源的做法可能会取得一定效果。但总的来看,此类做法的边际成本是不断上升的...
摘要:是最有名的爬虫框架之一,可以很方便的进行抓取,并且提供了很强的定制型,这里记录简单学习的过程和在实际应用中会遇到的一些常见问题一安装在安装之前有一些依赖需要安装,否则可能会安装失败,的选择器依赖于,还有网络引擎,下面是下安装的过程下安装安装 scrapy是python最有名的爬虫框架之一,可以很方便的进行web抓取,并且提供了很强的定制型,这里记录简单学习的过程和在实际应用中会遇到的一...
阅读 2685·2021-11-24 09:39
阅读 989·2021-11-02 14:38
阅读 1289·2021-09-30 09:46
阅读 3810·2021-09-10 11:26
阅读 2592·2021-08-25 09:40
阅读 2147·2019-08-30 15:54
阅读 357·2019-08-30 10:56
阅读 1135·2019-08-27 11:07