为什么在lua中要将ipairs设置为local?

代码:

local ipairs = ipairs     -- 为什么要将ipairs设置为本地变量?

local Access = {}

function Access.find_access_tag(source,access_tags_hierarchy)
    for i,v in ipairs(access_tags_hierarchy) do
        local tag = source:get_value_by_key(v)
        if tag then
            return tag
        end
    end
    return nil
end

return Access

我之前没有见过将ipairs定义为本地变量的情况。我试图在互联网上找到它,但没有找到有用的信息。任何评论都将不胜感激。

点赞
用户5675002
用户5675002

这是速度优化,当 ipairs() 被频繁调用时,这很有意义。

调用全局函数会涉及每次调用函数时搜索全局环境表。当将该函数复制到局部变量中时,您不再搜索它,您只需从最快可达位置获取该函数。

2019-11-14 09:10:36
用户2858170
用户2858170

在提供的代码中,除非在模块中使用,否则这不会有任何区别。

在 Lua 中,使用本地变量比使用全局变量更快。这就是为什么您应该尽可能使用本地变量的原因之一。

local sin = math.sin
for i = 1, 1000000 do
  local x = sin(1)
end

for i = 1, 1000000 do
  local x = math.sin(1)
end

快约30%

因为

for var_1, ···,var_n in explist do block end

等同于以下代码:

do
   local f, s, var = explist
   while true do
     local var_1, ···,var_n = f(s, var)
     if var_1 == nil then break end
     var = var_1
     block
   end
 end

explist仅评估一次,因此在使ipairs本地时不会有性能收益。

验证的简单示例:

local ipairs = function(t) print("ipairs called") return ipairs(t) end
for i,v in ipairs({1,2,3}) do end

仅打印一次“ipairs called”。

但是,如果您经常调用Access.find_access_tag,那么可能会受益,因为您会从更快地查找ipairs中获得收益。

2019-11-14 09:23:27