在创建Lua函数的本地副本方面有性能价值吗?

在创建 print()pairs()ipairs() 等常见 Lua 函数的本地副本时,是否有任何价值?

示例:

local _print = print
local _pairs = pairs
local _ipairs = ipairs

for i, v in _ipairs(someTable) do
    _print(v)
end

我看到一些使用这种方法编写的 Lua 代码,想知道是否有任何优点(性能或其他方面)?

点赞
用户107090
用户107090

主要动机可能是性能,因为访问全局变量需要哈希表查找,而访问局部变量不需要。但是,您应该在程序中测量差异。不要过度使用。

请注意,您不需要使用不同的名称:您可以编写 local print=print 等,以便程序的其余部分实际上不需要知道这些变量是本地还是全局的。

最后,将全局变量的值保存到本地变量中时存在语义差异:您正在进行早期绑定;如果您的程序调用使用相同函数的外部模块,它将使用 当前 值,而不是您拥有的冻结值。换句话说,稍后的重定义,比如说 print,不会影响您。

有关性能的更长讨论,请阅读Lua程序设计珠玑的第二章。

定义通用函数的本地副本的另一个动机是重新定义它们并仍保留原始函数。

2013-08-07 02:54:42
用户1009479
用户1009479

这是《Lua Programing Gems》中的一个例子:

访问外部局部变量(即在封闭函数中局部定义的变量)不如访问局部变量快,但仍比访问全局变量快。请看下面的代码段:

function foo (x)
  for i = 1, 1000000 do
    x = x + math.sin(i)
  end
  return x
end
print(foo(10))

我们可以通过在函数 foo 之外声明 sin 来进行优化:

local sin = math.sin
function foo (x)
  for i = 1, 1000000 do
    x = x + sin(i)
  end
  return x
end
print(foo(10))

这段第二个代码运行速度比原来的代码快 30%。

2013-08-07 03:00:17