Является ли одномерный или двумерный массив более эффективным в вычислительном отношении в Lua для большой матрицы? - PullRequest
0 голосов
/ 04 сентября 2018

В В частности, Lua , который является наименее затратным в вычислительном отношении: матрица, в которой элемент, найденный в (строка, столбец), расположен в matrix[row][column] или в matrix[row + numberOfRows * column]?

Предположим, что эти элементы будут прочитаны и записаны в лот , и предположим, что матрица имеет размер большой при 1000 на 2000 элементов.

Меня больше всего интересует эффективность, а не накладные расходы.

1 Ответ

0 голосов
/ 04 сентября 2018

Как показано ниже, 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

Опять измерьте обе альтернативы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...