使用局部变量优化

lua-users home
wiki

概述

局部变量速度非常快,因为它们通过索引访问。

"局部变量非常快,因为它们驻留在虚拟机寄存器中,并且通过索引直接访问。另一方面,全局变量驻留在 lua 表中,因此通过哈希查找访问。" -- 托马斯·杰斐逊

将全局变量设为局部变量

局部变量速度非常快,因为它们通过索引访问。如果可能,将全局变量设为局部变量(奇怪吧?)。说真的,这非常有效,索引访问总是比哈希查找更快。如果一个变量,比如 `GameState`,需要全局范围以便从 C 访问,那么创建一个看起来像 `local GSLocal = GameState` 的辅助变量,并在模块中使用 `GSLocal`。这种技术也可以用于重复调用的函数。例如:
x = { a=1,b=2 }
function foo()
  local y=x
  print( x.a )
  print( y.b )  -- faster than the print above since y is a local table
end
注意,这同样适用于全局函数(包括标准库函数),例如:

(史蒂夫·德科特) 我刚开始尝试使用它,效果很好。例如,这段代码

local i, v = next(t, nil)
while i do i, v = next(t, i) end
如果你将 `next` 设为局部变量,速度会提高 10%。
local next = next
local i, v = next(t, nil)
while i do i, v = next(t, i) end
我还进行了一些其他测试,发现 foreach() 比等效的 while 循环快约 20%,而 foreachi() 比 while 循环慢约 20%。
for i, v in t do end   -- about 5x as fast as a while

请记住,史蒂夫在他的测试中测量的是循环开销(循环体为空)。实际上,循环体中有一些语句,因此开销并不那么显著。-- 约翰·贝尔蒙特


另请参阅:优化技巧
最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2018 年 3 月 27 日下午 2:33 GMT (差异)