LuaJIT:脚本访问全局变量的次数有多少次?

我正试图优化我的 LuaJIT 代码,并想知道是否有调试工具,或者我是否可以编写一个工具来检查我的脚本访问全局变量/表/函数的次数。

点赞
用户1944004
用户1944004

你可以使用代理表来存储全局变量,并将任何对全局表的访问重定向到带有跟踪功能的代理表中。

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

Wandbox 上的示例

2019-09-19 08:16:43
用户88888888
用户88888888

那么,如果有人想知道,下面是我编写的最终代码,结合了评论和原始答案。它会写出用户定义和内置全局变量的访问。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("设置全局变量 ", k, "\n")
        io.write(debug.traceback(), "\n")
        rawset(globals, k, v)
    end,
    __index = function (_, k)
        gnumber = gnumber + 1
        io.write("获取全局变量 ", k, "\n")
        io.write(debug.traceback(), "\n")
        return rawget(globals, k)
    end,
})
2019-09-19 14:22:22