perf: Amortize GC latency - #431
Conversation
|
請問 lua table 是在 M.func 中動態產生的臨時資料嗎, 如果把 lua->gc() 增加 參數 可以選擇 LuaTranslation::LuaTranslation() 儲存 LUA_GCCOUNT (當時的使用量) |
|
这里指的是module或component init时产生的大型查询表。正是因为一直无法回收,full gc反复扫描才会导致浪费时间。要解决这个问题我感觉只能是提供某种api把table转换成C++侧的数据来避免扫描了…… 具体参数是我测出来的,肯定还有改进空间,不过我发现step取一个较保守的参数似乎没有什么问题。 |
luafilter module 是用 requile file(lua_gears.cc:raw_init) return table {func fini init} , -- module file
local data = nil
local function init_data()
--產生大量回收資料
end
local M={}
function M.init(env)
data = and data or init_data() -- 只會發生在require 載入file 時
end
-- ....
return M
''' |
|
大概知道你說的了,靜態資料也會GC檢查, LUA_GCCOLLECT 還是少用爲妙 |
follow-up: #308
follow-up: #396
变更
在 #396 的基础上引入 step(32) 从而均摊 full gc 的延迟
现有问题
目前每次 LuaTranslation 析构都会触发一次 full gc。若 lua 中有较大 table,每次 full gc 都会扫描一遍。实测显示我这里每次 full gc 有至少 1ms 的延迟,则每增加一个 lua filter,都会增加 1ms 的延迟,有明显体感。事实上,该延迟还可能因各种因素叠加(如 lua 中状态积累导致扫描的对象数量越来越多),最终总按键延迟可能超过 10ms 乃至更多。
变更后效果