lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hi,

I initialy posted to signal I met the same problems as the
original poster, but actually I gave up Lua level
optimizations some time ago.  However I'm still interested
in the discussion and your help is welcome :-)

And I am always interested in benchmark results that update me on what is fast and what is not fast. Since I have
been lazy to run my own benchmarks, I thought I had a shot at getting someone else to try these things for me. :)


Safety: Not suggesting that either. Just saying that you
can use a single table lookup for type safety, instead of
getting a metatable from the object, another from the
registry (keyed by a string!), and comparing them. You
could use a weakly keyed table of valid light userdata,
keyed by their values, and store it as an upvalue to the
functions that need to do error checking. Error checking
would reduce to one table lookup (keyed by something
easier to hash) and a isnil check.

Correct me if I'm wrong, but the trade is one getmetatable (which afaik is not a table lookup), one table lookup (the type metatable from the registry) and a rawequal for my current method, versus two table lookups (the weak table from the registry and the object inside the weektable) and a isnil. I can believe there's a gain but it's not obvious. Or maybe I missed something.

There is only one table lookup. The weak table is not in the registry, it is an upvalue to rotate/translate/copy. Upvalues should be pretty fast. Plus, the table lookup that actually happens uses a lightuserdata as the key. The luaL_checkudata function uses a full string, not even a literal string. I think the string has to be traversed for its length, hashed, and compared, perhaps even allocated if not found. The lightuserdata is just a pointer, so I expect the lookup to be much faster. Then again, I haven't measured the gains yet (but at some point I will).

I don't know how much faster that would be, but I am
using this strategy in the new version of LuaSocket. Very
clean, very simple, totally safe.

Is that in the last released version of in one about to be released ?

Neither. On the one that is not quite about to be released: LuaSocket 3.0 (I know, it is taking forever). LuaSocket objects use the method syntactic sugar and must be finalized, which requires a metatable. Therefore I can't simply lightuserdata for the sockets. Maybe there is a way, but it has not occured to me yet. Perhaps using environments for the methods, and an associated full userdata for finalization (using the same weakly-keyed table trick to associate). Lightuserdata cannot have environments, though... I don't know why. Dead-lock.

LuaSocket 3.0, however, has many uses for lightuserdata,
hence the idea. Even for objects with metatable, the idea of
using a lightuserdata as key to the table with classes
(instead of a string with the class name, use a pointer to a
static string, pushed as lightuserdata) and of using an
upvalue instead of the registry might still be worth it.  So
I may backport these to LuaSocket 2.x.

Kind regards,
Diego