我正在尝试优化我的LuaJIT代码,我想知道是否有调试工具,或者我能否编写一个来检查我的脚本访问全局变量/表/函数的次数?
我正在尝试优化我的LuaJIT代码,我想知道是否有调试工具,或者我能否编写一个来检查我的脚本访问全局变量/表/函数的次数?
local globals = {}
setmetatable(_G, {
__newindex = function (_, k, v)
print(debug.traceback("Setting global variable " .. k, 2))
rawset(globals, k, v)
end,
__index = function (_, k)
print(debug.traceback("Getting global variable " .. k, 2))
return rawget(globals, k)
end,
})
a = 1
a = 2
print(a)
样例输出:
Setting global variable a
stack traceback:
prog.lua:15: in main chunk
[C]: at 0x00404960
Setting global variable a
stack traceback:
prog.lua:16: in main chunk
[C]: at 0x00404960
Getting global variable a
stack traceback:
prog.lua:18: in main chunk
[C]: at 0x00404960
2
local globals = {}
替换为 local globals=_G; _G={}; setfenv(1, _G); setfenv(0, _G)
。 - Egor Skriptunoff如果有人在想,这是我写的最终代码,结合了注释和原始答案。它可以输出用户定义和内置全局变量的访问情况。 gnumber 和 snumber 只是计数器,可以打印出全局变量被设置或检索的总次数。
local globals = _G
_G = {}
local gnumber, snumber = 0, 0
globals.setfenv(0, _G)
setmetatable(_G, {
__newindex = function (_, k, v)
snumber = snumber + 1
io.write("Setting global variable ", k, "\n")
io.write(debug.traceback(), "\n")
rawset(globals, k, v)
end,
__index = function (_, k)
gnumber = gnumber + 1
io.write("Getting global variable ", k, "\n")
io.write(debug.traceback(), "\n")
return rawget(globals, k)
end,
})
_G
上放置一个元表,该元表注册__index
和__newindex
函数。这也在“Lua编程”中进行了解释。 https://www.lua.org/pil/14.2.html - Henri Menke