Как показано ниже, matrix[row][column]
использует на одну команду VM меньше, чем matrix[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
for column=1,numberOfColumns do
matrix[row][column]=f(row,column)
end
end
возможно медленнее, чем этот
for row=1,numberOfRows do
local r=matrix[row]
for column=1,numberOfColumns do
r[column]=f(row,column)
end
end
Опять измерьте обе альтернативы.