45 lines
1.2 KiB
Lua
45 lines
1.2 KiB
Lua
-- i have no idea how accurate this is, i use documentation from the below link for a few things
|
|
-- https://wowwiki-archive.fandom.com/wiki/Lua_object_memory_sizes
|
|
|
|
local function estimate_memory_usage(thing, seen)
|
|
local typ = type(thing)
|
|
if typ == "nil" then
|
|
return 0
|
|
end
|
|
|
|
seen = seen or {}
|
|
if seen[thing] then
|
|
return 0
|
|
end
|
|
seen[thing] = true
|
|
|
|
if typ == "boolean" then
|
|
return 4
|
|
elseif typ == "number" then
|
|
return 8 -- this is probably larger?
|
|
elseif typ == "string" then
|
|
return 25 + typ:len()
|
|
elseif typ == "function" then
|
|
-- TODO: we can calculate the usage of upvalues, but that's complicated
|
|
return 40
|
|
elseif typ == "userdata" then
|
|
return 0 -- this is probably larger
|
|
elseif typ == "thread" then
|
|
return 1224 -- this is probably larger
|
|
elseif typ == "table" then
|
|
local size = 64
|
|
for k, v in pairs(thing) do
|
|
if type(k) == "number" then
|
|
size = size + 16 + estimate_memory_usage(v, seen)
|
|
else
|
|
size = size + 40 + estimate_memory_usage(k, seen) + estimate_memory_usage(v, seen)
|
|
end
|
|
end
|
|
return size
|
|
else
|
|
futil.log("warning", "estimate_memory_usage: unknown type %s", typ)
|
|
return 0 -- ????
|
|
end
|
|
end
|
|
|
|
futil.estimate_memory_usage = estimate_memory_usage
|