Lua表:在0处启动数组索引的性能命中率



我正在将FFT代码从Java移植到Lua,我开始有点担心这样一个事实:在Lua中,表的数组部分从1开始索引,而在Java中,数组索引从0开始。

对于输入数组,这不会造成问题,因为Java代码的设置是为了处理所考虑的数据不位于数组开头的可能性。但是,假定代码内部的所有工作数组都从0开始索引。我知道代码会像写的那样工作——Lua表就是这样棒极了——但我对数组的"0"元素进入底层C结构的哈希表部分可能会带来的性能打击完全没有感觉(或者说,如果会发生这种情况的话)。

我的问题是:这值得担心吗?我应该计划评测并手动优化代码吗?(该代码最终将用于转换许多相对较小(>100个时间点)的不同长度的信号,这些信号事先不知道。)

我做了一个小的,可能不是那么可靠的测试:

local arr = {}
for i=0,10000000 do
  arr[i] = i*2
end
for k, v in pairs(arr) do
  arr[k] = v*v
end

以及以1作为第一个索引的类似版本。在我的系统上:

$ time lua example0.lua
real  2.003s
$ time lua example1.lua
real  2.014s

我还对table.insert将如何执行感兴趣

for i=1,10000000 do
  table.insert(arr, 2*i)
...

令人惊讶的是

$ time lua example2.lua
real 6.012s

结果:当然,这取决于你运行的系统,可能还有whic-lua版本,但零启动和一启动之间似乎没有什么区别。较大的差异是由您将事物插入数组的方式引起的。

我认为在这种情况下,正确的答案是更改算法,使所有内容都用1索引。考虑一下转换的这一部分。

你的FFT对另一个Lua用户(像我一样)来说不会那么令人惊讶,因为所有"类似数组"的表都是由一索引的。

考虑到Lua中数字循环的结构方式(其中"开始"one_answers"结束"是"包含的"),这可能没有你想象的那么紧张。你会交换这个:

for i=0,#array-1 do
  ... (do stuff with i)
end

通过这个:

for i=1,#array do
  ... (do stuff with i)
end

非数字循环将保持不变(除非您也可以使用ipairs,如果您愿意的话)。

最新更新