Matrix 对于大型矩阵,1D或2D数组在Lua中的计算效率是否更高?

Matrix 对于大型矩阵,1D或2D数组在Lua中的计算效率是否更高?,matrix,optimization,lua,runtime,Matrix,Optimization,Lua,Runtime,特别是在Lua中,计算成本最低的一种矩阵:在(行、列)中找到的项位于matrix[row][column]或位于matrix[row+numberOfRows*column] 假设这些项目将被大量读取和写入,并假设矩阵在大约1000到2000个项目时是大的 我主要关心当前的效率而不是开销。如下所示,矩阵[row][column]使用的VM指令比矩阵[row+numberOfRows*column]少一条。然而,尚不清楚一个GETTABLE是否比MUL+ADD更快 唯一真正的答案是:衡量两种选择

特别是在Lua中,计算成本最低的一种矩阵:在(行、列)中找到的项位于
matrix[row][column]
或位于
matrix[row+numberOfRows*column]

假设这些项目将被大量读取和写入,并假设矩阵在大约1000到2000个项目时是大的


我主要关心当前的效率而不是开销。

如下所示,
矩阵[row][column]
使用的VM指令比
矩阵[row+numberOfRows*column]
少一条。然而,尚不清楚一个
GETTABLE
是否比
MUL+ADD
更快

唯一真正的答案是:衡量两种选择

$ cat 1
local matrix,row,numberOfRows,column
return matrix[row][column]

$ luac -l 1
main <1:0,0> (5 instructions at 0x7f9459c03d40)
0+ params, 5 slots, 1 upvalue, 4 locals, 0 constants, 0 functions
    1   [1] LOADNIL     0 3
    2   [2] GETTABLE    4 0 1
    3   [2] GETTABLE    4 4 3
    4   [2] RETURN      4 2
    5   [2] RETURN      0 1

$ cat 2
local matrix,row,numberOfRows,column
return matrix[row + numberOfRows * column]

$ luac -l 2
main <2:0,0> (6 instructions at 0x7ff339c03d40)
0+ params, 5 slots, 1 upvalue, 4 locals, 0 constants, 0 functions
    1   [1] LOADNIL     0 3
    2   [2] MUL         4 2 3
    3   [2] ADD         4 1 4
    4   [2] GETTABLE    4 0 4
    5   [2] RETURN      4 2
    6   [2] RETURN      0 1
可能比这个慢

for row=1,numberOfRows do
    local r=matrix[row]
    for column=1,numberOfColumns do
        r[column]=f(row,column)
    end
end

同样,测量两种备选方案。

通常1d要么更好,要么相同,但您可以用您的用例描述两种方法,以确定有许多因素可能会影响速度。表通常是用数组部分实现的,所以如果其中没有nil,访问任何元素都是O(1)。使用表,您将拥有更多GC管理的对象,这会对GC造成更大的压力,并导致内存碎片。但是,您需要对此进行测量,而不是进行随机猜测。
$ cat 1
local matrix,row,numberOfRows,column
return matrix[row][column]

$ luac -l 1
main <1:0,0> (5 instructions at 0x7f9459c03d40)
0+ params, 5 slots, 1 upvalue, 4 locals, 0 constants, 0 functions
    1   [1] LOADNIL     0 3
    2   [2] GETTABLE    4 0 1
    3   [2] GETTABLE    4 4 3
    4   [2] RETURN      4 2
    5   [2] RETURN      0 1

$ cat 2
local matrix,row,numberOfRows,column
return matrix[row + numberOfRows * column]

$ luac -l 2
main <2:0,0> (6 instructions at 0x7ff339c03d40)
0+ params, 5 slots, 1 upvalue, 4 locals, 0 constants, 0 functions
    1   [1] LOADNIL     0 3
    2   [2] MUL         4 2 3
    3   [2] ADD         4 1 4
    4   [2] GETTABLE    4 0 4
    5   [2] RETURN      4 2
    6   [2] RETURN      0 1