寄存器模式
寄存器模式是ILRuntime2.0版引入的专用于优化大规模数值计算的执行模式。该模式通过ILRuntime自己的JIT Compiler将原始DLL的MSIL指令集转换成一个自定义的基于寄存器的指令集,再进行解译执行。由于该JIT编译的结果是ILRuntime自己设计的虚拟指令集,并不是真实硬件指令集,因此可以毫无问题的在iOS等平台上执行
使用方法
开启寄存器模式,主要有2个途径:
//第一种方式是在AppDomain的构造函数的参数中,指定全局希望使用的JIT模式 |
ILRuntime的JIT模式有以下几种:
- JITOnDemand,按需JIT模式,使用该模式在默认的情况下会按照原始的方式运行,当该方法被反复执行时,会被标记为需要被JIT,并在后台线程完成JIT编译后切换到寄存器模式运行
- JITImmediately,立即JIT模式,使用该模式时,当方法被调用的瞬间即会被执行JIT编译,在第一次执行时即使用寄存器模式运行。JIT会在当前线程发生,因此如果方法过于复杂在第一次执行时可能会有较大的初始化时间
- NoJIT, 禁用JIT模式,该方法在执行时会始终以传统方式执行
- ForceInline, 强制内联模式,该模式只对方法的Attribute生效,标注该模式的方法在被调用时将会无视方法体内容大小,强制被内联
寄存器模式的性能特点
当ILRuntime运行在寄存器模式时,主要会有以下性能特征:
- 数值计算性能会大幅提升,包括for循环等需要数值计算的控制流
- 由于小方法会被内联,所以getter/setter等的调用开销,for循环里调用其他热更内方法的性能也会有所提升
- 如果一个方法既没有数值计算,又没有频繁调用热更内小方法或者访问property, 主要由调用系统或UnityAPI组成,则不会产生任何优化,一些情况下可能性能还低于传统模式
使用建议
ILRuntime推荐的使用模式有2种:
- AppDomain构造函数时不指定JIT模式,即默认使用传统模式执行,在遇到就要优化的密集计算型方法时,对该方法指定JITImmediately模式
- 直接在AppDomain构造函数处指定JITOnDemand模式
第一种用法对现有实现影响最小,仅在需要优化处开启,可以比较精准的控制执行效果。如果并不知道在什么时候应该使用何种模式,也可以直接使用JITOnDemand模式,让ILRuntime自行决定运行模式,在大多数情况下是能达到不错的性能平衡的。