[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Userdata environment
- From: Shmuel Zeigerman <shmuz@...>
- Date: Mon, 31 Mar 2008 16:59:36 +0200
Alex Davies wrote:
Simply to save memory. A pointer to a table takes some 4 bytes (x86),
where as a fully tagged value takes 12-16 bytes depending on alignment.
When you consider that many people use userdata just to store 8-16
bytes, that's quite an optimization. Also by ensuring that the
environment is never null, a minor time/complexity saving can be made
there. (as getenv always returns a table).
I'm not sure these were the reasons.
In my case, creating an extra table per a userdata, and doing an extra
table lookup per access seem to be way more expensive.
The other way around your problem is of course to use a single weak
keyed table, and your userdata as keys. It'd save a fair amount of
memory, but I'm not sure which is better from a gc perspective.
This is how my application was doing originally. But unfortunately, Lua
tables used as dictionaries won't always reclaim memory when their
entries are deleted. After several millions creations and deletions of
userdata, this (empty!) table was holding > 100 MBytes of RAM that could
not be reclaimed with garbage collector.