Решил я как-то поискать методы оптимизации кода для ОпенКомпов, и Луа в целом. Но на форуме, вроде, я не нашел тему, где в одном месте сконцентрированы вещи, помогающие в оптимизации. Разве что нашел одну ветку, на заморском форуме, вот ее компиляция/перевод/адаптация/дополнение:
(за помощь в переводе, спасибо KoshakLol и Google Translate)
# Место в памяти
Вот таблица, где есть, сколько что занимает в памяти:
boolean, number и string занимают 9 байт.
Указатель на функцию, или на таблицу, тоже 9 байт.
Пустая функция (function() end) занимает 93 байт, пустая функция с return (function() return true end) занимает 102 байт.
Пустая таблица занимает 36 байт, плюс за каждую степень двойки (2^n) еще дополнительно:
9 байт для 0-1 элементов в таблице
18 байт для 2 элементов в таблице
36 байт для 3-4 элементов в таблице
71 байт для 5-8 элементов в таблице
142 байт для 9-16 элементов в таблице
284 байт для 17-32 элементов в таблице
569 байт для 33-64 элементов в таблице
и т.д.
И, кстати, таблицы не сжимаются, то есть если туда запихать 1000 элементов, а потом удалить их, то весить она будет, как будто в ней все еще 1000 элементов
# Сборка мусора
Автоматический сборщик мусора в опенкомпах вроде бы отключен, и вызывается только через os.sleep(0), и то не гарантированно, так что разработчик мода советует его вызывать 10 раз подряд, чтоб уж точно
И еще, автоматический сборщик чистит ТОЛЬКО локальные переменные
# Советы сомнительной эффективности (от них я не засек прироста)
Убрать из кода деление, потому что оно, якобы, медленнее, чем умножение (условно:)
local a = n / 4
-->
local a = n * 0.25
Заменить все условные операторы, на логические тернарные операторы, где это возможно (условно:)
if (a > b) then
c = a
else
c = b
end
-->
c = (a > b) and a or b
(Если вы не поняли, что сейчас вообще было, то в этой теме все расписано)
Менять переменные местами, без буфера (Lua 5.3+)
local a = 174
local b = 3
a = a ~ b
b = a ~ b
a = a ~ b
print(a)
--> 3
print(b)
--> 174
(Если вы не поняли, что сейчас вообще было, то ищите битовую операцию XOR)
Этот совет дает хотя бы небольшой прирост, из-за того, что нет лишний переменной, но этот плюс нивелируется, если ее удалить
# В итоге
Не используйте рекурсию функций, а если совсем приспичило, то почаще вставляйте сбор мусора
Не используйте замыкания (это когда функция возвращает другую функцию)
Старайтесь не использовать таблицы, вместо них лучше делать так:
local coords = {x = 10, y = 20, z = 370} -- (72 байта)
-->
local x = 10
local y = 20
local z = 370 -- (27 байт)
-- или вообще
local xyz = 010020370 -- (9 байт)
print("z = ", xyz // 1000000, "\ny = " , xyz // 1000 % 1000, "\nz = ", xyz % 1000)
-- (Если вы не поняли, что сейчас вообще было, то ищите деление с остатком)
Старайтесь не использовать не-локальные переменные, так как они бьют по архитектуре программы, и их не собирает гарбадж коллектор
# P.S
В данной заметке рассматривалась только сторона оптимизации кода, определенный код может отвратительно выглядеть, но работать быстро, и наоборот, в реальных программах лучше соблюдать баланс, между красотой, и быстродействием, в какой-нибудь программе для EEPROM'a, допустим, вообще о красоте кода не идет и речи
Ну это в целом все, что я хотел рассказать, если есть исправления/уточнения/дополнения/свои_идеи, то милости прошу в комментарии