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

Live example on Wandbox

所以,如果有人想知道,这是我编写的最终代码,结合了评论和原始答案。这会写出用户定义和内置的全局变量访问。 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,
})