Lua表:启动数组索引的性能是否为0?

时间:2014-10-09 14:37:31

标签: lua lua-table

我正在将FFT代码从Java移植到Lua,我开始担心在Lua中,表的数组部分开始索引为1而Java数组索引从0开始。

对于输入数组,这不会产生任何问题,因为Java代码被设置为处理所考虑的数据不在数组的开头的可能性。但是,代码内部的所有工作数组都假定在0处开始索引。我知道代码将按照写入的方式工作 - Lua表就像那样很棒 - 但我根本没有任何关于性能影响的意义我通过让数组的“0”元素进入底层C结构的哈希表部分(或者实际上,如果会发生这种情况)可能会导致这种情况发生。

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

2 个答案:

答案 0 :(得分:3)

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

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

结果: 当然,这取决于你运行它的系统,可能也是lua版本,但它似乎在零启动和一启动之间几乎没有区别。将内容插入数组的方式会产生较大的差异。

答案 1 :(得分:0)

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

对于另一个Lua用户(像我一样),你的FFT将不那么令人惊讶,因为所有"类似阵列的"表由一个索引。

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

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

由此:

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

非数字循环将保持不变(除非您可以使用ipairs,否则也是如此)。