为什么在卢阿将ipairs设置为本地?

kkx*_*kxx 2 lua

码:

local ipairs = ipairs     -- why set this ipairs as local? 

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
Run Code Online (Sandbox Code Playgroud)

我还没有看到将ipairs定义为本地的。我试图从互联网上找到它,但是没有发现任何有用的东西。任何意见,不胜感激。

Pig*_*let 5

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

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

local sin = math.sin
for i = 1, 1000000 do
  local x = sin(1)
end
Run Code Online (Sandbox Code Playgroud)

比大约快30%

for i = 1, 1000000 do
  local x = math.sin(1)
end
Run Code Online (Sandbox Code Playgroud)

但是作为

 for var_1, ···, var_n in explist do block end
Run Code Online (Sandbox Code Playgroud)

等效于代码:

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
Run Code Online (Sandbox Code Playgroud)

explist仅被评估一次,因此在ipairs本地

验证的简单示例:

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

只会打印一次“已配对”。

但是,如果您Access.find_access_tag经常打来电话,它可能会有所回报,因为您将从更快的配对中受益。

  • 当人们尝试实施他们不了解的优化时,就会发生这种情况。始终编​​写简单的代码,然后对其进行基准测试,并*可能*考虑您可以做些什么来对其进行优化。然后再次进行基准测试,扔掉任何实际上不会提高性能的东西。 (2认同)