为什么在Lua中本地化函数更快?

4

TEST 1: Localize

Code:

local min = math.min

Results:

Non-local: 0.719 (158%)
Localized: 0.453 (100%)

Conclusion:

Yes, we should localize all standard lua and Spring API functions.

来源:https://springrts.com/wiki/Lua_Performance

 

那个性能提升的原因是什么?


6
访问本地变量就是从堆栈位置读取值。相反,math.min 表示双重查找表的哈希部分(在全局表中搜索 math,并在 math 表中搜索 min),需要使用 CPU 密集型的哈希函数计算字符串 mathmin 的哈希值。 - Egor Skriptunoff
1
尝试使用local math = math而不是local min = math.min来测试您的时间。 - lhf
5
可能与“是否在Lua中创建本地函数副本有性能价值?”这个问题重复。 - Yu Hao
1
这与函数无关,也就是说,与被访问的值的类型无关。它只涉及到评估表达式以获取值的复杂度。 - Tom Blodget
1个回答

7

本地变量 min = math.min

请记住,table.name 只是语法糖代替了 table["name"](它们完全等价)。而全局变量只是环境表中的键,所以 math.min 相当于 _ENV["math"]["min"]。这是两个哈希表查找才能得到实际的函数值。

将值复制到 local 中可以将其放置在 VM 寄存器中,因此不需要查找。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接