1、hyengine 项淘在移动 WebAssembly 的引擎优化技术实践刘辉(知兵)阿巴巴 淘宝技术部2023/02/05刘辉(知兵)阿巴巴淘宝技术部程师,hyengine 项发起2015 年加阿巴巴开始虚拟机开发及相关应落地,2017 年在机淘宝端智能团队定制适应客户端的 Python 移植及优化,2020 年开始 hyengine 项,探索编译技术对 JavaScript/WebAssembly 等语性能优化及在移动设备上的应。录Wasm3 解释器的性能优化剖析hyengine 的引hyengine 对 WebAssembly 的持总结展望01 Wasm3解释器的性能优化剖析Wasm3 的
2、编译实现Wasm3 的尾调优化Wasm3 的指令优化Wasm3 解释器的性能对(官)其他 interpreter(解释器)的案快的多!编译优化:减少指令解析开销 尾调优化:减少控制流开销 指令优化:减少指令执开销Wasm3 的编译实现(1)wac 的主循环段 wasm 进制0 x200 x000 x410 x020 x490 x040 x400 x200 x00local.get0i32.const2i32.lt_uiflocal.get0whileswitchcase 0 x20wac 执流程read localidxload variablestore variablecontinueWa
3、sm3 的编译实现(2)wac 的 read_LEBWasm3 的编译实现(3)wasm3 编译后段 wasm 进制0 x200 x000 x410 x020 x490 x040 x400 x200 x00local.get0i32.const2i32.lt_uiflocal.get00 x0000000104a32a90op_Entry0 x00006000036d86800 x0000000104a2d9e8op_u32_LessThan_ss0 x00000000000000040 x00000000000000020 x0000000104a33248op_If_r0 x0000000
4、127816e700 x0000000104a330e8op_CopySlot_320 x0000000000000000常量提前布局参数提前读取指令地址提前计算使物理寄存器变量提前布局内存量增加编译过程耗时优化:副作:Wasm3 的尾调优化(1)wac 的主循环和 global.get 实现wasm3 的 global.get 实现Wasm3 的尾调优化(2)wac 的主循环和 global.get 的汇编(精简后)wasm3 的 global.get 的汇编(主循环)Wasm3 的指令优化i32.add_op_i32_Add_rs_op_i32_Add_ss_op_i32_Add_srop
5、_数据类型_操作_数据存放式s:stack,r:register6条指令 3次内存访问8条指令 5次内存访问apple m1 数据访问耗时(单位cycle):寄存器 1,l1 缓存 3,l2缓存 18,内存 18+91ns02 hyengine 的引业务的性能问题和解释器的局限性为什么要做 hyenginehyengine 的现有架构介绍业务场景的性能问题在Android中端机器上 只能跑到20帧左右 如:8/pixel 3解释器的局限性取栈偏移取栈操作数做加法计算取下条指令地址pc指针加到下条指令位置跳转到下条指令地址为了完成 1 次加法计算,需要 3 条数据加载指令,2 条计算指令,1 条
6、跳转指令如何更快?JIT为什么要做 hyengineluapythonwasmjavascript机App的痛点cluacpythonwasm3javascript corev8duktapequickjs动态化跨平台性能包机淘宝过的引擎引擎临挑战hyengine 引擎轻量级多语性能稳定性跨平台hyengine 的现有架构介绍hybytecodeassembler(arm64)object generator(android)js jitwasm jithybytecode jitjs bytecodeswift/kotlin irjs frontendswift/kotlin fronten