История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
Очень много конкатенаций и взятия подстрок, всё это аллокации, плюс много мусора порождается разового. Сборку мусора можно вызывать вручную (если тебе не урезали API), так ты размажешь сборку на все итерации, времени она займёт столько же (плюс накладные расходы на вызовы), но не будет секундного затупа в конце работы спустя время.
Каждую итерацию
Но, тут тоже будет много холостых операций.
collectgarbage("step")
Или, вызывать при достижении порога памяти, тем самым размазывая сборку мусора, но ступеньками.
-- до входа в цикл обработки данных
local overmem = 1000
local trigger = collectgarbage("count") + overmem
-- внутри цикла обработки данных
local currmem = collectgarbage("count")
if currmem >= trigger then
collectgarbage("collect")
trigger = collectgarbage("count") + overmem
end
У тебя всё завязано на форматировании строк и конкатенациях, а это по сути самое медленное что в lua есть.
Избавляться от локальных переменных пробовал
Избавляться от самого быстрого в языке для ускорения программы не надо :)
Вместо превращений строк одни в другие может организовать структуры данных.
И обращатся не к подстрокам data:sub(blabla,blabla)
а к полям данных data.key
А если нужно всё же сохранять поля данных в строку, для хранения например, то делать это лишь тогда когда это необходимо, как экспорт данных через string.format
.
Больше мыслей нет
Исправление LINUX-ORG-RU, :
Очень много конкатенаций и взятия подстрок, всё это аллокации, плюс много мусора порождается разового. Сборку мусора можно вызывать вручную (если тебе не урезали API), так ты размажешь сборку на все итерации, времени она займёт столько же (плюс накладные расходы на вызовы), но не будет секундного затупа в конце работы спустя время.
Каждую итерацию
Но, тут тоже будет много холостых операций.
collectgarbage("step")
Или, вызывать при достижении порога памяти, тем самым размазывая сборку мусора, но ступеньками.
-- до входа в цикл обработки данных
local overmem = 1000
local trigger = collectgarbage("count") + overmem
-- внутри цикла обработки данных
local currmem = collectgarbage("count")
if currmem >= trigger then
trigger = currmem + overmem
collectgarbage("collect")
end
У тебя всё завязано на форматировании строк и конкатенациях, а это по сути самое медленное что в lua есть.
Избавляться от локальных переменных пробовал
Избавляться от самого быстрого в языке для ускорения программы не надо :)
Вместо превращений строк одни в другие может организовать структуры данных.
И обращатся не к подстрокам data:sub(blabla,blabla)
а к полям данных data.key
А если нужно всё же сохранять поля данных в строку, для хранения например, то делать это лишь тогда когда это необходимо, как экспорт данных через string.format
.
Больше мыслей нет
Исходная версия LINUX-ORG-RU, :
Очень много конкатенаций и взятия подстрок, всё это аллокации, плюс много мусора порождается разового. Сборку мусора можно вызывать вручную (если тебе не урезали API), так ты размажешь сборку на все итерации, времени она займёт столько же (плюс накладные расходы на вызовы)
Каждую итерацию
Но, тут тоже будет много холостых операций.
collectgarbage("step")
Или, вызывать при достижении порога памяти, тем самым размазывая сборку мусора, но ступеньками.
-- до входа в цикл обработки данных
local overmem = 1000
local trigger = collectgarbage("count") + overmem
-- внутри цикла обработки данных
local currmem = collectgarbage("count")
if currmem >= trigger then
trigger = currmem + overmem
collectgarbage("collect")
end
У тебя всё завязано на форматировании строк и конкатенациях, а это по сути самое медленное что в lua есть.
Избавляться от локальных переменных пробовал
Избавляться от самого быстрого в языке для ускорения программы не надо :)
Вместо превращений строк одни в другие может организовать структуры данных.
И обращатся не к подстрокам data:sub(blabla,blabla)
а к полям данных data.key
А если нужно всё же сохранять поля данных в строку, для хранения например, то делать это лишь тогда когда это необходимо, как экспорт данных через string.format
.
Больше мыслей нет