[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: newproxy, bug
- From: Geoff Leyland <geoff_leyland@...>
- Date: Tue, 11 Jan 2011 13:53:19 +1300
On 11/01/2011, at 12:32 PM, Mike Pall wrote:
> (*) In particular since Lua has a performance problem with empty
> or sparsely populated proxy tables: each write attempt tries to
> lookup the key and create a hash slot for it in the proxy table
> (this happens *before* even looking for __newindex). But those
> hash slots never get a value, so the keys constantly kick each
> other out. Depending on the usage pattern, this may lead to lots
> of costly branch prediction misses.
It took a while to work out how to stop LuaJIT optimising out the loops altogether - it might still be optimising more than I want.  I'm sure this is not a good test, but for what it's worth:
$ lua proxytest.lua 
   variable indexing   userdata       5063 k iterations/second
   variable indexing      table       3579 k iterations/second
   constant indexing   userdata       5231 k iterations/second
   constant indexing      table       4094 k iterations/second
$ luajit-2.0.0-beta5 proxytest.lua 
   variable indexing   userdata     393305 k iterations/second
   variable indexing      table      75364 k iterations/second
   constant indexing   userdata     396092 k iterations/second
   constant indexing      table     394164 k iterations/second
local sum = 0
function variable(p, c)
  for i = 1, c do
    p[i+1] = p[i]
  end
end
function constant(p, c)
  for i = 1, c do
    p[2] = p[1]
  end
end
function test(p, f, name)
  local start = os.clock()
  local outer, inner = 0, 100000
  while os.clock() - start < 5 do
    f(p, inner)
    outer = outer + 1
  end
  io.write(("%20s %10s %10.0f %s\n"):format(name, type(p), (outer * inner) / (os.clock() - start) / 1000, "k iterations/second"))
end
proxy = newproxy(true)
getmetatable(proxy).__index = function(t, i) return i end
getmetatable(proxy).__newindex = function(t, i, v) sum = sum + i + v end
proxytable = setmetatable({}, { __index = function(t, i) return i end, __newindex = function(t, i, v) sum = sum + i + v end })
test(proxy, variable, "variable indexing")
test(proxytable, variable, "variable indexing")
test(proxy, constant, "constant indexing")
test(proxytable, constant, "constant indexing")
- References:
- newproxy, bug, joao lobato
- Re: newproxy, bug, Roberto Ierusalimschy
- Re: newproxy, bug, Javier Guerra Giraldez
- Re: newproxy, bug, Geoff Leyland
- Re: newproxy, bug, Mike Pall