[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: tracking Lua's memory usage
- From: "Dirk Feytons" <dirk.feytons@...>
- Date: Thu, 12 Jul 2007 17:18:14 +0200
Hi list,
for some benchmarking purposes I patched the default allocator
function in Lua to track the memory usage during the execution of a
script. I'm posting that patch to the list in case it is useful for
somebody else as well.
diff -urN lua-5.1.2/src/lauxlib.c lua-5.1.2_alloctrace/src/lauxlib.c
--- lua-5.1.2/src/lauxlib.c 2006-03-21 20:31:09.000000000 +0100
+++ lua-5.1.2_alloctrace/src/lauxlib.c 2007-07-12 16:55:17.000000000 +0200
@@ -627,13 +627,27 @@
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
(void)ud;
- (void)osize;
+
if (nsize == 0) {
+ if (ptr)
+ fprintf(stderr, "lua free %u\n", osize);
free(ptr);
return NULL;
}
else
+ {
+ if (osize)
+ {
+ if (osize < nsize)
+ fprintf(stderr, "lua alloc %u\n", nsize - osize);
+ else
+ fprintf(stderr, "lua free %u\n", osize - nsize);
+ }
+ else
+ fprintf(stderr, "lua alloc %u\n", nsize);
+
return realloc(ptr, nsize);
+ }
}
How it works: per allocation and free it prints a line to stderr with
the amount of bytes being requested/freed. If you redirect stderr to a
file you can unleash the following Lua script on it to transform the
data in a list of total amount of allocated memory at each
allocation/free. If you redirect the output of that script to another
file you can then plot those numbers in a nice graph.
-- begin memusage.lua
local memusage = 0
for line in io.lines(arg[1]) do
local amount = string.match(line, "alloc (%d+)")
if amount then
memusage = memusage + amount
else
amount = string.match(line, "free (%d+)")
if amount then
memusage = memusage - amount
end
end
print(memusage)
end
-- end memusage.lua
Regards,
Dirk