1 for _, v1 in ipairs(a) do for_, v2 in ipairs(b) do local x = math.sin(v1) * math.sin(v2) end end
优化后 使用全局变量,Lua预编译在生成的指令,需要添加获取类似以下代码: GETGLOBAL 0 0 ; a GETGLOBAL 1 1 ; b ADD 0 0 1 SETGLOBAL 0 0 ; a Lua预编译能够在寄存器存储剩余的局部变量,结果在Lua中访问局部变量非常快。
local tsin = math.sin for _, v1 in ipairs(a) do for_, v2 in ipairs(b) do local x = tsin(v1) * tsin(v2) end end
1 2 3 4 5 6 7 8 9 10 11 12
2 for i = 1, 2000000do local a = {} a[1] = 1; a[2] = 2; a[3] = 3 end 优化后 通过给出新表合适的大小,这很容易避免那些初始的再哈希。 for i = 1, 200000do local a = {true, true, true} a[1] = 1; a[2] = 2; a[3] = 3 end
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
3 local s = "" for i = 1, i < 300000do s = s .. 'a' end 优化后 在大字符串连接中,我们应避免..。应用table来模拟buffer,然后concat得到最终字符串。 local s = '' local t = {} for i = 1,300000do t[#t + 1] = 'a' end s = table.concat( t, '') b = os.clock()
functiondeepCopy(object) local lookup_table = {} localfunction_copy(object) iftype(object) ~= "table"then return object elseif lookup_table[object] then return lookup_table[object] end
local new_table = {} lookup_table[object] = new_table for key, value inpairs(object) do new_table[_copy(key)] = _copy(value) end returnsetmetatable(new_table, getmetatable(object)) end