截止至上一次发博文已经过了接近三个月时间,这么长的一段时间我主要是去做了以下几件事情,一个是实现 Lua 多线程的垃圾回收
方案,另一个则是 LuaJIT 5.3.6
实现。其实也没用到三个月,实现代码加上测试一共花了一个月。
Lua 多线程垃圾回收
这一块的思路主要是从 Redis
通过子线程释放内存这块学来的,通过这个小优化,使得我们游戏服务器在大量玩家下线时,不再出现大规模的掉帧,效果还是非常显著的。
LuaJIT 5.3.6
之所以实现这个 Lua 5.3.6 JIT
,其实是因为 LuaJIT 2.0
不支持 5.3的新扩展,而项目已经进行到了中后期,没有时间去调整代码了,最后花了半个月的时间去实现了一个小版本,通过了 Lua 的官方测试用例,也在项目用上了。性能方面提高了2-5倍,接入成本为0,不需要修改任何逻辑代码。
至于解释器部分,借鉴了 Lua 5.4
的一个小优化点,将 switch case
修改为了 computed goto
,提升了约 5%
的性能,之后可能会学习 Lua 5.4
扩展字节码。如果这个项目还做下去的话(我有时间的话),我会想尝试解释器执行脚本时记录各个操作数的类型,实现动态替换字节码,减少不必要的类型判断,从而提升一定的解释器速度。不过这个方案风险太大,暂时先搁置。
在实现 LuaJIT 5.3.6
的过程中,顺带复习了一下编译原理的前端部分,实现了一些官方不支持的语法,比如 ‘+=’,自增表达式(当然没有提交),还是非常有趣的。
结语
以上的代码实现已经开源,合并之前的 NOGC
优化思路,LuaJIT-5.3.6,欢迎 Star
,这对我很重要。