LuaJIT:一个脚本访问了多少次全局变量?
LuaJIT: How many times a script accessed global variables?
我正在尝试优化我的 LuaJIT 代码,我想知道是否有调试工具,或者我是否可以编写一个工具来检查我的脚本访问全局的次数 variables/tables/functions?
您可以使用代理 table 来存储全局变量并将对全局变量 table 的任何访问转移到此代理,并带有跟踪功能。
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
所以,如果有人想知道,这是我编写的最终代码,结合了评论和原始答案。这会写出用户定义和内置的全局变量访问。 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,
})
我正在尝试优化我的 LuaJIT 代码,我想知道是否有调试工具,或者我是否可以编写一个工具来检查我的脚本访问全局的次数 variables/tables/functions?
您可以使用代理 table 来存储全局变量并将对全局变量 table 的任何访问转移到此代理,并带有跟踪功能。
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
所以,如果有人想知道,这是我编写的最终代码,结合了评论和原始答案。这会写出用户定义和内置的全局变量访问。 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,
})