Lua 5.1链式函数调用与局部赋值后调用的性能差异问题咨询
问题结论
你设计的基准测试没有问题,此前关于「Lua 5.1链式调用性能弱于先存局部变量再调用」的固有认知是错误的:这两种写法在你测试的场景下性能几乎没有差异。
核心原因
- Lua编译器处理两种写法时生成的字节码逻辑完全等价:
plugin:Test():SubTest()的实现逻辑就是把plugin:Test()的返回值临时压在虚拟机栈上,直接作为后续SubTest调用的self参数,和你显式声明局部变量存储返回值再调用的逻辑完全一致。 - Lua的局部变量分配会被虚拟机的寄存器分配优化处理,你额外声明的
module局部变量不会产生任何额外的运行开销,两种写法的执行路径完全一致。
补充说明
你的固有认知只在「需要多次调用同一个返回对象的多个方法」的场景下成立:比如你需要连续调用10次返回对象的SubTest方法,链式写法需要重复执行10次plugin:Test()生成新对象,这时候提前把返回值存为局部变量的写法性能会高很多。但你当前测试的单次调用单方法场景下,两种写法没有性能差距。
你可以通过luac -l命令编译测试代码查看字节码,就能直观看到两种写法的核心执行逻辑完全一致。
内容的提问来源于stack exchange,提问作者Richard Avalos
相关产品推荐
相关产品推荐

