什么是通过数字索引快速遍历数组/表的方法?

假设我有一个带有数字索引的 Lua 数组,并且需要至少一次遍历每个条目,使用数字 for 循环或通用 for 循环哪个更快?

原文链接 https://stackoverflow.com/questions/71276468

点赞
stackoverflow用户10401934
stackoverflow用户10401934

在这种情况下,使用数字 for 循环会更快。但差别不大,在我的测试中更容易受到系统负载差异的影响。

数字循环

a = {} -- 新数组
for i = 1, 10000000 do
    a[i] = 10000000 + i
end

local startNumLoop = os.time(os.date("!*t"))

for i = 1, #a, 1 do
    local value = a[i]
end

local stopNumLoop = os.time(os.date("!*t"))

local numloop = stopNumLoop - startNumLoop

print(os.clock())

结果:1.379 - 1.499

通用循环

a = {} -- 新数组
for i = 1, 10000000 do
    a[i] = 10000000 + i
end

local startGenLoop = os.time(os.date("!*t"))

for index, value in ipairs(a) do

end

local stopGenLoop = os.time(os.date("!*t"))

local genLoop = stopGenLoop- startGenLoop

print(os.clock())

结果:1.568 - 1.662

测试使用lua.org的lua 5.3.6 win32二进制文件进行。

这只是我一个没有及时找到答案的问题。如果这确实是重复问题,可以打上重复标记。 :)

2022-02-26 12:04:19
stackoverflow用户11740758
stackoverflow用户11740758

特别是在需要删除/更改当前键/值对的循环中,我更喜欢快速的倒计时方法...

for i = #tab, 1, -1 do
 if (tab[i].x > x) then
  table.remove(tab, i) -- 查看注释
 end
end

...例如在 LÖVE \ [love2d] 的两个帧之间。

2022-02-26 15:56:25