架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 656|回复: 1

[交流] .NET 中 JIT 和 AOT 编译介绍和区别

[复制链接]
发表于 2024-2-15 17:17:46 | 显示全部楼层 |阅读模式
专业术语

CLI: Common Language Infrastructure 通用语言基础架构 是.NET框架下的一种规范,CLI定义了语言无关的跨体系结构的运行环境。因此我们可以用规范下的各种高级语言开发软件,这些软件无需修改可以运行在不同的计算机体系结构中

CLR: Common Language Runtime 通用语言运行时。是一种规范,保证运行环境是与语言无关并且跨体系结构的

CTS: Common Type System 通用类型系统

CLS: Common Language Specification 通用语言规范

FCL: Framework Class Library 架构类库,包含两部分: 基础类库 Base Class  Library 和成品类库

IL: Immediate Language 中间语言,高级语言Compiler 将高级语言的Source Code 编译成 中间语言。

JIT: Just In Time Compiler 将中间语言编译成计算机可以理解的机器码,然后可以执行

Source Code 经过C# Compiler 编译成IL(也就是程序及dll、exe等)。 CLR加载这些IL,经过JIT编译成机器码,最终被执行,如下图:

QQ截图20240215171054.jpg

JIT(Just-in-time compiler)即时编译

即时编译器 (JIT) 是.NET中公共语言运行时 (CLR)的一部分,负责管理.NET程序的执行,无论任何.NET编程语言如何。特定语言的编译器将源代码转换为中间语言。然后,这种中间语言由即时 (JIT) 编译器转换为机器代码。该机器代码特定于 JIT 编译器运行的计算机环境。  JIT编译器的工作: JIT编译器需要加快代码执行速度并提供对多个平台的支持。其工作原理如下:

QQ截图20240215171147.jpg

JIT 编译器将 Microsoft 中间语言 (MSIL) 或通用中间语言 (CIL) 转换为机器代码。这是在执行 MSIL 或 CIL 之前完成的。 MSIL 根据需要转换为机器代码,即 JIT 编译器根据需要编译 MSIL 或 CIL,而不是编译整个代码。存储已编译的 MSIL 或 CIL,以便在需要时可供后续调用。

JIT 优点:

  • 可以根据当前硬件情况实时编译生成最优机器指令
  • 可以根据当前程序的运行情况生成最优的机器指令序列
  • 当程序需要支持动态链接时,只能使用JIT的编译方式
  • 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用


JIT 缺点:

  • 编译需要占用运行时Runtime的资源,会导致进程执行时候卡顿
  • 编译占用运行时间,对某些代码编译优化不能完全支持,需在流畅和时间权衡
  • 在编译准备和识别频繁使用的方法需要占用时间,初始编译不能达到最高性能


AOT(Ahead-of-time compiler)提前编译

在计算机科学中,提前编译(AOT 编译)是在执行程序之前(通常在构建时)将(通常)高级编程语言编译为(通常)低级语言的行为,以减少运行时需要执行的工作量。

大多数情况下,它与将高级编程语言(例如C或C++)或中间表示形式(例如Java 字节码或.NET Framework通用中间语言(CIL) 代码)编译为本机(依赖于系统)的行为相关。)机器代码,以便生成的二进制文件可以本机执行,就像标准本机编译器一样。当在这种特定环境中使用时,它通常被视为即时(JIT) 编译的对立面。

AOT 编译是在程序编译或安装前进行的,也就是说,它将脚本或字节码预先编译为机器码,并在需要时直接执行。这种方式可以提高程序启动速度和避免编译过程带来的延迟。

AOT 优点:

  • 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
  • 可以在程序运行初期就达到最高性能
  • 可以显著的加快程序的执行效率


AOT 缺点:

  • 在程序运行前编译会使程序安装的时间增加
  • 将提前编译的内容保存起来,会占用更多的内存
  • 牺牲高级语言的一致性问题


总结

JIT:吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制
AOT:内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化

QQ截图20240215171614.jpg

参考:

https://www.zhihu.com/question/23874627
https://www.geeksforgeeks.org/what-is-just-in-time-jit-compiler-in-dot-net/
https://blog.osvlabs.com/?p=523
https://www.cnblogs.com/taylorshi/p/16629071.html
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/
https://www.cnblogs.com/happymiles/p/3789707.html
https://learn.microsoft.com/en-us/visualstudio/debugger/jit-optimization-and-debugging?view=vs-2022





上一篇:.NET/C# 高性能将多个文件合并成一个文件
下一篇:.NET/C# 集合 List、HashSet 判断元素是否存在基准测试
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-3-10 10:58:59 | 显示全部楼层
.NET/C# 之 Roslyn 编译器平台
https://www.itsvse.com/thread-10740-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-7-21 16:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表