[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: newproxy, bug
 
- From: Geoff Leyland <geoff_leyland@...>
 
- Date: Thu, 13 Jan 2011 11:11:39 +1300
 
On 13/01/2011, at 10:02 AM, Florian Weimer wrote:
> * Geoff Leyland:
> 
>> 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:
> 
> It seems that if you use non-constant keys chosen from a small set,
> the performance hit from using tables is much smaller.  Isn't that the
> more relevant case?
Mike's already replied to that, so I won't pretend to have a clue.  Nonetheless, here is a different version of the earlier test.  It might be better.  It attempts to use Mike's
> p.x = 1; p.x = 1; p.y = 1; p.z = 1; p.z = 1; p.z = 1; p.y = 1;
pattern and attempts to get a measure of memory use.  It suggests that a newproxy() userdata takes about a third of the memory of an empty table.  I'm sure people knew that already, but I didn't and it hadn't come up in this thread.
$ lua proxytest.lua 
variable indexing    userdata  :     5.8154 sec,       1956 kb
variable indexing    table     :     6.8741 sec,       5079 kb
Ratios: time: 0.845975, memory 0.385089
constant indexing    userdata  :     3.4771 sec,       1953 kb
constant indexing    table     :     4.6225 sec,       5078 kb
Ratios: time: 0.752226, memory 0.384615
$ luajit proxytest.lua 
variable indexing    userdata  :     2.6869 sec,       1173 kb
variable indexing    table     :     3.4948 sec,       3907 kb
Ratios: time: 0.768837, memory 0.300332
constant indexing    userdata  :     1.6689 sec,       1172 kb
constant indexing    table     :     2.3886 sec,       3906 kb
Ratios: time: 0.698690, memory 0.300000
Cheers,
Geoff
local char, byte = string.char, string.byte
local sum = 0
local char_offset, char_set_size = byte('a'), 26
local outer_loops, inner_loops = 50000, 100
function variable(p, c)
  for i = 1, c do
    local c0 = i + char_offset - 1 
    local x, y, z = char(c0%char_set_size), char((c0+1)%char_set_size), char((c0+2)%char_set_size)
    p[x] = 1; p[x] = 1; p[y] = 1; p[z] = 1; p[z] = 1; p[z] = 1; p[y] = 1;
  end
end
function constant(p, c)
  for i = 1, c do
    p.x = 1; p.x = 1; p.y = 1; p.z = 1; p.z = 1; p.z = 1; p.y = 1;
  end
end
function test(p, f, name)
  collectgarbage("collect")
  collectgarbage("stop")
  local initial_memory = collectgarbage("count")
  local start = os.clock()
  for i = 1, outer_loops do
    f(p(), inner_loops)
  end
  local time = os.clock() - start
  local memory = collectgarbage("count") - initial_memory
  io.write(("%-20s %-10s: %10.4f sec, %10.0f kb\n"):format(name, type(p()), time, memory))
  return time, memory
end
local p0 = newproxy(true)
getmetatable(p0).__index = function(t, i) return byte(i) end
getmetatable(p0).__newindex = function(t, i, v) sum = sum + v end
function new_proxy()
  return newproxy(p0)
end
local t0m = { __index = function(t, i) return byte(i) end, __newindex = function(t, i, v) sum = sum + v end }
function new_proxy_table()
  return setmetatable({}, t0m)
end
local t1, m1 = test(new_proxy, variable, "variable indexing")
local t2, m2 = test(new_proxy_table, variable, "variable indexing")
io.write(("Ratios: time: %8.6f, memory %8.6f\n"):format(t1/t2, m1/m2))
local t1, m1 = test(new_proxy, constant, "constant indexing")
local t2, m2 = test(new_proxy_table, constant, "constant indexing")
io.write(("Ratios: time: %8.6f, memory %8.6f\n"):format(t1/t2, m1/m2))
- 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
 
- Re: newproxy, bug, Geoff Leyland
 
- Re: newproxy, bug, Florian Weimer