LuaJIT: Сколько раз скрипт обращался к глобальным переменным? - PullRequest
3 голосов
/ 19 сентября 2019

Я пытаюсь оптимизировать свой код LuaJIT, и мне интересно, есть ли инструмент отладки или я могу написать его, чтобы проверить, сколько раз мой скрипт обращался к глобальным переменным / таблицам / функциям?

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Вы можете использовать прокси-таблицу для хранения глобальных переменных и перенаправления любого доступа к глобальной таблице на этот прокси-сервер, украшенный функцией трассировки.

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

0 голосов
/ 19 сентября 2019

Итак, если кому-то интересно, это последний код, который я написал, объединивший комментарии и оригинальный ответ.Это записывает определенные пользователем и встроенные в глобальные переменные доступы.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,
})
...