Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging LuaJIT:一个脚本访问全局变量的次数是多少?_Debugging_Lua_Global Variables_Luajit - Fatal编程技术网

Debugging LuaJIT:一个脚本访问全局变量的次数是多少?

Debugging LuaJIT:一个脚本访问全局变量的次数是多少?,debugging,lua,global-variables,luajit,Debugging,Lua,Global Variables,Luajit,我正在尝试优化我的LuaJIT代码,我想知道是否有调试工具,或者我是否可以编写一个,来检查我的脚本访问全局变量/表/函数的次数?您可以使用代理表来存储全局变量,并将对全局表的任何访问转移到此代理,并使用跟踪功能进行修饰 localglobals={} 可设置图元(_G{ __newindex=函数(k,v) 打印(debug.traceback(“设置全局变量“.k,2)) rawset(globals,k,v) 完,, __索引=函数(μ,k) 打印(debug.traceback(“获取全局

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

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

localglobals={}
可设置图元(_G{
__newindex=函数(k,v)
打印(debug.traceback(“设置全局变量“.k,2))
rawset(globals,k,v)
完,,
__索引=函数(μ,k)
打印(debug.traceback(“获取全局变量“.k,2))
返回rawget(全局,k)
完,,
})
a=1
a=2
印刷品(a)
样本输出:

设置全局变量a
堆栈回溯:
程序lua:15:在主块中
[C] :在0x00404960处
设置全局变量a
堆栈回溯:
程序lua:16:在主块中
[C] :在0x00404960处
获取全局变量a
堆栈回溯:
程序lua:18:在主块中
[C] :在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,
})

只需在
\u G
上放置一个元表,该元表注册
\u索引
\u新索引
函数。这也是在“Lua编程”中解释的,谢谢你,作品很有魅力!还有魔杖盒链接。我甚至不知道,有一个网站,在那里我可以用那么多种语言运行代码。投票通过并被接受,但没有声誉好,还有一件事。这适用于我声明的东西,但不会被任何内置函数/表(数学模块、类型函数等)触发。有没有办法也被这些函数/表触发?@MorsMortium-Replace
localglobals={}
localglobals=\u G_G={};setfenv(1,_G);setfenv(0,_G)
这给了我:尝试调用全局“setfenv”(一个零值)是的,我是。如果我只是将_G设置为{},我如何访问全局变量