lua-users home
lua-l archive

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


Are you currently encountering performance problems with the method you
described?  Beware the spectre of premature optimization!

With that said, depending on the kind of data you're searching, you
could probably get away with maintaining an external index.  But that's
not really searching the table then. =)

-Rob

On Fri, 08 Apr 2011 22:55:48 +0200
Henning Diedrich <hd2010@eonblast.com> wrote:

> Hi list,
> 
> is there a faster way of doing the following basic search, i.e. can
> the traversal of the table be made more efficient? Specifically,
> using something other than lua_next() maybe?
> 
> This below is by the book, based on the manual [1]:
> 
>     static int search(lua_State *L, int idx, char* needle) {
> 
>          int not_found = 1;
>          int type = lua_type(L, idx);
> 
>          if(type == LUA_TTABLE) {
>              lua_pushnil(L);
>              while (not_found && lua_next(L, idx) != 0) {
>                  not_found = search(L, idx+2);
>                  lua_pop(L, 1);
>              }
>              lua_pop(L, 1);
>          }
>          else if(type == LUA_TSTRING) {
>                  const char *hay = lua_tostring(L, idx);
>                  not_found = inspect(hay, needle);
>          }
>          return not_found;
>     }
> 
> 
> The source is abbreviated and not tested in the exact way listed
> above, so if there should be a syntax flaw, my bad. But it's about
> the usage of the Lua API.
> 
> Thanks a lot,
> Henning
> 
> [1] http://www.lua.org/manual/5.1/manual.html#lua_next :
> 
>     "A typical traversal looks like this:
> 
>           /* table is in the stack at index 't' */
>           lua_pushnil(L);  /* first key */
>           while (lua_next(L, t) != 0) {
>             /* uses 'key' (at index -2) and 'value' (at index -1) */
>             printf("%s - %s\n",
>                    lua_typename(L, lua_type(L, -2)),
>                    lua_typename(L, lua_type(L, -1)));
>             /* removes 'value'; keeps 'key' for next iteration */
>             lua_pop(L, 1);
>           }"
> 

Attachment: signature.asc
Description: PGP signature