AOT 和 JIT、 IL2CPP和Mono、 CLR、 ILRuntime热更新原理

AOT 和 JIT

字面意思:JIT:Just In Time AOT:Ahead of Time

区别: 主要区别在于是否在“运行时”进行编译.

优劣: AOT优点: 1.在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗. 2.可以在程序运行初期就达到最高性能. 3.可以显著的加快程序的启动. AOT缺点: 1.在程序运行前编译会使程序安装的时间增加. 2.牺牲Java的一致性. 3.将提前编译的内容保存会占用更多的外存.

JIT优点: 1.可以根据当前硬件情况实时编译生成最优机器指令(ps:AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译). 2.可以根据当前程序的运行情况生成最优的机器指令序列. 3.当程序需要支持动态链接时,只能使用JIT. 4.可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用. JIT缺点: 1.编译需要占用运行时资源,会导致进程卡顿. 2.由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡. 3.在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能.

IL2CPP【AOT编译】

CLR(公共语言运行库)在运行期管理程序的执行:主要包含:内存管理、代码安全验证、代码执行、垃圾收集

IL2CPP相比Mono的优劣

unity中的AOT、JIT、IL2CPP、Mono_勤学者闯天涯的博客-CSDN博客_aot unity

Mono interpreter 介绍

New. NET interpreter – Mono has arrived | Develop Paper

框架:https://github.com/focus-creative-games/huatuo

huatuo框架在Mono interpreter技术启发下实现了AOT+interpreter形式

从底层彻底支持了热更新dll。

误区

IOS 只支持AOT模式的,Mono 可提供AOT模式和 JIT模式上的,所以在IOS上是可以用MONO的,不过需要选用MONO的AOT模式,并不是在ios平台上必须要选中IL2cpp

ILRuntime热更新原理是什么?

原文 ILRuntime热更新原理是什么? -- UWA问答:帮助开发者找到更好的答案

请问ILRuntime热更新的底层原理是什么?能否这样理解:常规的CLR需要JIT编译方法为机器语言后存入内存,再调用该内存执行,所以需要内存执行权限,ios封了内存的执行权限所以没法JIT只能AOT。ILRuntime实现了对于IL的解释执行,解释执行是逐句直接调用机器语言,跳过了内存执行这个步骤,所以实现了热更?

不是逐句调用机器语言,而是逐句解析il指令,你用ildasm查看 一个dll内容,会发现就是许多的类汇编的指令结构。查看ilruntime源码你会发现,内部有一个很大的switch/case结构,就是针对基本上每一条il指令码进行解释,同时维护一个stackframe用于模拟cpu的函数调用的基本操作进行辅助解释。
ilruntime中解释热更dll中的自定义类实例,在框架层这边都是对应的同一个warper,即iltyeinstance。iltyeinstance会知道最终被调用方法的il指令内容,如果调用,则就是switch逐句去解析这个方法的il码,这里面会发现没有什么执行权限的问题,简单理解为读取一个普通文件,然后解析文件内容。如果是反射处理这种情形,那就是真实的构建出一个新的类型,然后调用新类型的方法,这倒是会涉及到内存权限问题。
所以:ilruntime整个过程中没有涉及到新类型的生成,都是iltypeinstance,没有涉及到新类型的内存执行权限的问题。

一家之言 
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值