Теперь я предлагаю разобрать таблицу inventories и код, работающий с ней. Сейчас эта таблица строится при запуске программы таким образом:
local function initInventories()
for i = 0, 5, 1 do
local name = transposer.getInventoryName(i)
local size = transposer.getInventorySize(i)
if name then
table.insert(inventories, newInventory(i, name, size))
end
end
end
Здесь я бы предпочёл избавился от вызова функции newInventory. Хотя быстродействие этого участка кода и не критично, но оно немного увеличится. А главное, упростится обслуживание кода спустя месяц-другой: не потребуется искать функцию newInventory, чтобы вспомнить детали её работы. Необходимые детали окажутся в месте непосредственного их использования:
table.insert(inventories, {
side = side,
name = name,
size = size,
stacks = {}
})
Есть и не столь очевидная оптимизация. Бегло изучив код, я предполагаю, что более эффективно себя покажет другой формат таблицы. И строить её следует так:
local function initInventories()
for side = 0, 5 do
local name = transposer.getInventoryName(side)
if name then
inventories[side] = {
name = name,
size = transposer.getInventorySize(side),
stacks = {}
})
end
end
end
Быстродействие этого участка кода увеличивается незначительно, но для сохранения работоспособности программы вслед за ним потребуется переписать и другие участки, новые варианты которых могут исполняться как более, так и менее эффективно. Для оценки общего изменения эффективности требуется более подробный анализ. В дальнейшем таблица inventories используется в следующих функциях:
В функции drawInfo текущий код
for i = 1, #inventories do
local inventory = inventories[i]
gpu.set(1, i + 9, inventory.side .. " : " .. inventory.size .. " : " .. inventory.name)
end
будет немного усложнён и замедлен:
local i = 0
for side = 0, 5 do
if inventories[side] then
i = i+1
gpu.set(1, i + 9, side .. " : " .. inventories[side].size .. " : " .. inventories[side].name)
end
end
Но содержащая его функция drawInfo вызывается один раз при запуске программы, а также используется в функции drawAdditional, которая вызывается лишь во время редактирования фильтров пользователем, что должно происходить редко.
В функции getStacks текущий код
for i = 1, #inventories do
local inventory = inventories[i]
inventory.stacks = transposer.getAllStacks(inventory.side)
end
также будет усложнён и замедлен:
for side = 0, 5 do
if inventories[side] then
inventories[i].stacks = transposer.getAllStacks(inventory.side)
end
end
Вызывается эта функция один раз при запуске программы, и далее каждый раз в главном цикле программы, то есть часто. Это уже неприятно и заставляет сомневаться в правильности смены формата таблицы inventories.
В функции getInventoryBySide текущий код
for i = 1, #inventories, 1 do
local inventory = inventories[i]
if inventory.side == side then
return inventory
end
end
будет сильно упрощён и ускорен:
return inventory[side]
Благодаря этому от вызова функции getInventoryBySide можно будет полностью отказаться. Количество вызовов функции getInventoryBySide в основном цикле равно удвоенному количеству фильтров. Даже если фильтр всего один, такая оптимизация уже позволит снизить общую нагрузку, создаваемую программой.
По совокупному снижению нагрузки я считаю данную оптимизацию полезной.
Также, если есть желание максимально повысить быстродействие программы, пожертвовав потреблением памяти, можно сформировать сразу две таблицы. Одну с номерами рабочих сторон транспозера для упрощения их перечисления, где это требуется, и вторую таблицу с ассоциативным доступом к нужной стороне транспозера без необходимости использовать перечисление.