【问题标题】:LuaJIT: How many times a script accessed global variables?LuaJIT:脚本访问全局变量多少次?
【发布时间】:2020-01-19 22:23:24
【问题描述】:

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

【问题讨论】:

  • 只需在_G 上放置一个元表,它会注册__index__newindex 函数。这在“Lua 编程”lua.org/pil/14.2.html 中也有解释

标签: debugging lua global-variables luajit


【解决方案1】:

您可以使用代理表来存储全局变量并将对全局表的任何访问转移到此代理,并带有跟踪功能。

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

【讨论】:

  • 谢谢你,就像一个魅力!对于魔杖盒链接也是如此。我什至不知道,有一个网站可以运行这么多语言的代码。赞成并接受,但没有声誉
  • 好吧,还有一件事。这适用于我声明的东西,但不会被任何内置函数/表(数学模块、类型函数等)触发。有没有办法让它们也被触发?
  • @MorsMortium - 将 local globals = {} 替换为 local globals=_G; _G={}; setfenv(1, _G); setfenv(0, _G)
  • 这给了我:尝试调用全局“setfenv”(一个零值)
  • 是的,我是。如果我只是将 _G 设置为 {},我如何访问全局变量
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 2016-03-29
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多