[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: void* in Lua_State for Application?
- From: Tim Hill <drtimhill@...>
- Date: Thu, 5 Sep 2013 13:03:45 -0700
On Sep 5, 2013, at 7:31 AM, Roberto Ierusalimschy <roberto@inf.puc-rio.br> wrote:
>> On Wed, Sep 4, 2013 at 8:33 PM, Tom N Harris <telliamed@whoopdedo.org> wrote:
>>> On Monday, September 02, 2013 03:14:08 PM Emil Renner Berthing wrote:
>>>> +LUA_API void (lua_setstatedata) (lua_State *L, void *sd);
>>>> +LUA_API void *(lua_getstatedata) (lua_State *L);
>>>
>>> What's the problem with storing a lightuserdata in the registry?
>>
>> Performance, mostly. That's a table lookup worth of overhead for every
>> function that needs to fetch it. A C function accessing a field in the
>> lua_State is substantially faster.
>
> Did you benchmark it for any real case (that is, a case that will waste
> some time doing something useful with the retrieved pointer)?
>
> -- Roberto
>
Yes I did. The C API is a mix of heavy-ish functions that do a chunk of work, and some very light operation that just get/set values from a structure; it's these light ones that concerned me.
On an x86 system compiled for 64-bit code (cannot recall the CPU, but was recent pedigree), we saw about a 20-30% performance drop when using the registry compared to using a pointer "hidden" in a custom memory allocator for the light APIs. Unsurprisingly there was no measurable difference when the C API did a lot of work. On an ARM we saw about the same overhead, but there was a greater spread, which I was unable to account for (possibly a result of smaller CPU caches).
--Tim