local foo = { a=1, b=2, c=3 }
bar = setmetatable({}, {__index = foo})
baz = setmetatable({}, {__index = function(_,x) return foo[x] end })
local iterations, begin, a,b,c = 1000000
begin = os.clock()
for i=1,iterations do a,b,c = foo.a,foo.b,foo.c end
local direct = os.clock() - begin
begin = os.clock()
for i=1,iterations do a,b,c = bar.a,bar.b,bar.c end
local meta = os.clock() - begin
begin = os.clock()
for i=1,iterations do a,b,c = baz.a,baz.b,baz.c end
local closure = os.clock() - begin
local nop = function(x,y) return begin end
begin = os.clock()
for i=1,iterations do nop(10,20) nop(10,20) nop(10,20) end
local funcoverhead = os.clock() - begin
local function printf(...) print(string.format(...)) end
printf('%25s: %.2f', 'direct', direct)
printf('%25s: %.2f (%.2f * direct)', 'metatable', meta, meta/direct)
printf('%25s: %.2f (%.2f * metatable)', 'closure', closure, closure/meta)
printf('%25s: %.2f', 'metatable + func overhead', meta + funcoverhead)