CE Lua чистка памяти от утечек
-
Хотя в последних версиях CE включили чистку памяти (надеюсь, что эта функция была и есть). Но может пригодится очистка памяти. Вдруг?
ИМХО отказываться от CE Lua скриптов из-за утечек памяти не стоит, если такая происходит. Т.е. оперативная память забивается каким-то мусором. Это бывает редко, когда пилишь плагины.
Можно чистить память следующим образом
function startCollectgarbageProcess(interval, showStatus) local timer1 = createTimer(true) timer1.Interval = interval timer1.onTimer = function () if (showStatus) then print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) end collectgarbage("restart") collectgarbage("collect") if (showStatus) then print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) end end end \-- Собирать каждую 1 минуту и показать результат startCollectgarbageProcess(60000, true)
-
Оптимизация CE Lua кода по сборке мусора
Есть инструкции, которые добавляют мусора больше чем другие.
Показываем объем памяти мусораprint(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024))
Ниже код того как попробовать узнать сколько мусора добавил код при парсинге ассемблерной строки двумя способами
local s = " 0045464A - FF 05 A4B54500 - inc [0045B5A4] { [000003EA] }" function GetDebugString(address) return splitDisassembledString(s) end \-- address, bytes, opcode function GetDebugString2(address) local clearString = string.gsub(s, '%s','') return string.match(clearString, '^(.-)%-(.-)%-(.-)$') end function NoOptimizeCode() GetDebugString2() end function OptimizeCode() GetDebugString() end local countRepeat = 500000 -- add more cycle local x1 = 0 local x2 = 0 x1 = getTickCount() print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) for i = 1, countRepeat do NoOptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) x2 = getTickCount() for i = 1, countRepeat do OptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) print(string.format("%.2f", (x2 - x1)/(getTickCount() - x2)) )
Пример результатов могут отличаться. Фиг его знает почему. Возможно работает сборщик мусора в разные моменты времени
Lua memory usage 1.8 MiB
Lua memory usage 1.8 MiB
Lua memory usage 1.8 MiB
1.49Lua memory usage 1.8 MiB
Lua memory usage 2.3 MiB
Lua memory usage 2.3 MiB
1.47Lua memory usage 2.3 MiB
Lua memory usage 2.8 MiB
Lua memory usage 2.8 MiB
1.49