我正在将FFT代码从Java移植到Lua,我开始担心在Lua中,表的数组部分开始索引为1而Java数组索引从0开始。
对于输入数组,这不会产生任何问题,因为Java代码被设置为处理所考虑的数据不在数组的开头的可能性。但是,代码内部的所有工作数组都假定在0处开始索引。我知道代码将按照写入的方式工作 - Lua表就像那样很棒 - 但我根本没有任何关于性能影响的意义我通过让数组的“0”元素进入底层C结构的哈希表部分(或者实际上,如果会发生这种情况)可能会导致这种情况发生。
我的问题:这是值得担心的吗?我应该计划分析和手动优化代码吗? (该代码最终将用于转换预先未知的不同长度的许多相对较小(> 100个时间点)的信号。)
答案 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
,否则也是如此)。