在Lua表中,从0开始索引数组会对性能产生影响吗?

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

对于输入数组,这不会造成问题,因为 Java 代码已设置为处理考虑到数据未位于数组开头的可能性。然而,代码内部的所有工作数组都假定从 0 开始索引。我知道代码将按原样工作-- Lua 表就是这么棒--但是我完全不知道在将“0”元素输入到底层 C 结构的哈希表中(或者实际上是否会发生这种情况)可能会导致的性能影响。

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

点赞
用户4127077
用户4127077

我进行了一个小的测试,可能不是非常可靠:

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 版本,但似乎在零启动和一启动之间几乎没有区别。更大的差异是由于您向数组中插入事物的方式。

2014-10-09 21:56:55
用户312586
用户312586

我认为在这种情况下,正确的答案是更改算法,使得所有东西都用1进行索引。并且考虑到这一转换部分。

考虑到Lua中数值循环的结构(“起始”和“结束”都是“包容性”的),这可能不会像你想象的那么紧张。你会用这个:

for i=1,#array do
  ... (使用i进行操作)
end

交换这个:

for i=0,#array-1 do
  ... (使用i进行操作)
end

对于非数值循环,除了你还可以使用ipairs,其余部分都不会变化。

2014-10-10 16:51:30