Lua—将变量与固定值列表进行比较的最节省资源的方法

Lua—将变量与固定值列表进行比较的最节省资源的方法,lua,lua-table,Lua,Lua Table,所以我有一个变量,我们称它为'ID'。我需要相对于固定数量的值检查此值。当然,ID只能匹配其中一个值,因此在第一个匹配值上停止不会有问题,因为其他值都不匹配。变量也有可能与任何给定值不匹配。我的问题是,做这件事最节省资源的方法是什么?我可以想出两种简单的方法来解决这个问题。由于我在编程时知道这些值,我可以设置一个带有“或”的条件,只检查每个值,如下所示: if (ID == "1" or ID == "16" or ID == "58") then --do something-- en

所以我有一个变量,我们称它为'ID'。我需要相对于固定数量的值检查此值。当然,ID只能匹配其中一个值,因此在第一个匹配值上停止不会有问题,因为其他值都不匹配。变量也有可能与任何给定值不匹配。我的问题是,做这件事最节省资源的方法是什么?我可以想出两种简单的方法来解决这个问题。由于我在编程时知道这些值,我可以设置一个带有“或”的条件,只检查每个值,如下所示:

if (ID == "1" or ID == "16" or ID == "58") then
    --do something--
end
这样做的问题是写起来相当冗长乏味。另一个选项涉及foreach循环,我在其中预先定义了一个表

values = {"1", "16", "58"}
for _, value in ipairs(values) do
    if(ID == value) then
        return true
    end
end
这样做的好处是它是可重用的,这是很好的,因为我需要用一组不同的值至少进行10次精确检查,缺点是我怀疑它需要更多的资源


如有任何帮助,将不胜感激。

表格可作为集合使用:

interesting = {
   ["1"] = true, ["16"] = true, ["58"] = true
}

if interesting[ID] then
   -- ...
end
虽然它消耗了更多的内存(每个空表80字节加上每个条目32字节(x86_64上的IIRC)(同时将条目数四舍五入到下一个二次方),但相比之下,每个比较需要16字节加上您比较的值的存储)比较链发生在C中,因此比作为Lua指令序列的比较链要快(至少当事情变得更大时)

对于少量的值,这并不重要。(如果您受到CPU的限制,这一点在您的情况下非常重要,请在您的程序上下文中进行测量,看看哪些性能更好。不要将太多的注意力放在微基准测试上,尤其是缓存行为可能会产生有趣的效果。)

对于大量比较而言,这是正确的方法。它也比
if
-
then
-
else
链更灵活。(您可以在运行时更改内容,而无需重新加载代码。)

还请注意,用于锚定集合中元素的值实际上并不重要,因此一个相对常见的习惯用法(尤其是对于输入处理)是将操作作为函数放入表中:

keybindings = {
   left = function()  Player:move_left( )  end,
   right = function()  Player:move_right( )  end,
   up = function()  Player:jump( )  end,
   -- ...
}

function onKey( k )
   local action = keybindings[k]
   if action then  action( )  end
end
虽然这肯定比直接比较和内联代码慢,但速度在这里基本上是不相关的(通常发生的频率远远低于每秒100倍),灵活性具有很高的价值