Lua - 将变量与固定值列表进行比较的最节省资源的方法
Lua - Most resource efficient way to compare a variable to a fixed list of values
所以我有一个变量,我们称它为'ID'。我需要相对于固定数量的值检查此值。当然,ID 只能匹配其中一个值,因此停在第一个匹配值上没有问题,因为其他 none 会匹配。变量也有可能与任何给定值都不匹配。那么我的问题是,执行此操作最节省资源的方法是什么?我可以想到两种简单的方法来解决这个问题。因为我知道编程时的值,所以我可以使用 'or' 设置一个条件,它只检查每个值,如下所示:
if (ID == "1" or ID == "16" or ID == "58") then
--do something--
end
问题是写起来很冗长乏味。另一个选项涉及一个 foreach 循环,我在其中预先定义了一个 table。
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 字节 table 加上 32 字节(IIRC,在 x86_64)(同时将条目数四舍五入到下一个 2 的幂)与每次比较 16 个字节加上您比较的值的存储)比较链发生在 C 中,因此比作为一系列 Lua 指令的比较链更快(至少一旦事情变大)。
对于少量值,这并不重要。 (如果你是 CPU-bound 并且这对你的情况非常重要,请在你的程序 的上下文中测量 并查看哪个表现更好。不要放太多重量在微基准测试中——缓存行为可能会在这里产生有趣的效果。)
对于大量比较,这是正确的方法。它也比 if
-then
-else
链更灵活。 (您可以在运行时更改内容而无需重新加载代码。)
另请注意,用于锚定集合中元素的值并不重要,因此一个相对常见的习惯用法(尤其是对于输入处理)是将操作作为函数放入 table :
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 次)并且灵活性具有很高的价值。
所以我有一个变量,我们称它为'ID'。我需要相对于固定数量的值检查此值。当然,ID 只能匹配其中一个值,因此停在第一个匹配值上没有问题,因为其他 none 会匹配。变量也有可能与任何给定值都不匹配。那么我的问题是,执行此操作最节省资源的方法是什么?我可以想到两种简单的方法来解决这个问题。因为我知道编程时的值,所以我可以使用 'or' 设置一个条件,它只检查每个值,如下所示:
if (ID == "1" or ID == "16" or ID == "58") then
--do something--
end
问题是写起来很冗长乏味。另一个选项涉及一个 foreach 循环,我在其中预先定义了一个 table。
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 字节 table 加上 32 字节(IIRC,在 x86_64)(同时将条目数四舍五入到下一个 2 的幂)与每次比较 16 个字节加上您比较的值的存储)比较链发生在 C 中,因此比作为一系列 Lua 指令的比较链更快(至少一旦事情变大)。
对于少量值,这并不重要。 (如果你是 CPU-bound 并且这对你的情况非常重要,请在你的程序 的上下文中测量 并查看哪个表现更好。不要放太多重量在微基准测试中——缓存行为可能会在这里产生有趣的效果。)
对于大量比较,这是正确的方法。它也比 if
-then
-else
链更灵活。 (您可以在运行时更改内容而无需重新加载代码。)
另请注意,用于锚定集合中元素的值并不重要,因此一个相对常见的习惯用法(尤其是对于输入处理)是将操作作为函数放入 table :
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 次)并且灵活性具有很高的价值。