Debug_LuaMemotry = {} local Enable = false local StringFormat = LogUtility.StringFormat local LogFormat = LogUtility.InfoFormat local LogIsEnable = LogUtility.IsEnable local LogSetEnable = LogUtility.SetEnable local FormatSize = LogUtility.FormatSize_KB local ArrayClear = TableUtility.ArrayClear local function FormatPercent(p) return StringFormat("{0:F2}%", p*100) end local memStart = nil local memEnd = nil local totalCost = nil local sampleMap = {} local sampleStack = {} local running = false function Debug_LuaMemotry.SampleBegin(k) if not Enable or not running then return nil end local v = sampleMap[k] if nil == v then v = {key=k,cost=0} sampleMap[k] = v end if nil ~= v.memStart then v.refCount = v.refCount + 1 else v.memStart = collectgarbage("count") v.refCount = 1 end return v end function Debug_LuaMemotry.SampleEnd(v) if not Enable or not running then return end if nil == v then return end if 0 < v.refCount then v.refCount = v.refCount-1 if 0 == v.refCount then v.cost = v.cost + collectgarbage("count")-v.memStart v.memStart = nil end end end function Debug_LuaMemotry.Start() if not Enable or running then return end running = true collectgarbage("collect") memStart = collectgarbage("count") memEnd = memStart totalCost = 0 for k,v in pairs(sampleMap) do v.memStart = nil v.cost = 0 v.refCount = 0 end end function Debug_LuaMemotry.End() if not Enable or not running then return end memEnd = collectgarbage("count") totalCost = memEnd-memStart for k,v in pairs(sampleMap) do if 0 < v.refCount then v.cost = v.cost + memEnd-v.memStart v.memStart = nil v.refCount = 0 end end running = false end local sortArray = {} local function SortComparator_Cost(v1, v2) return v1.cost > v2.cost end function Debug_LuaMemotry.Debug() if not Enable or not running then return end Debug_LuaMemotry.End() local logEnable = LogIsEnable() LogSetEnable(true) LogFormat("Lua Memory: {0}-->{1}, {2}", FormatSize(memStart), FormatSize(memEnd), FormatSize(totalCost)) if 0 < totalCost then local i = 1 for k,v in pairs(sampleMap) do sortArray[i] = v i = i+1 end table.sort(sortArray, SortComparator_Cost) for i=1, #sortArray do local v = sortArray[i] LogFormat("Lua Memory({0}): {1}, {2}", v.key, FormatSize(v.cost), FormatPercent(v.cost/totalCost)) end ArrayClear(sortArray) end LogSetEnable(logEnable) Debug_LuaMemotry.Start() end