剖析 Lua 程式碼 |
|
以下是 Lua 所提供的剖析器
您也可以透過 Lua Debug 函式庫撰寫自己的剖析器 [1]。
另請參閱 OptimisationTips。
[!] VersionNotice:以下程式碼適用於較舊的 Lua 版本,Lua 4。它無法在 Lua 5 中執行。
以下是剖析 Lua 程式碼的一些方法(來自 Roberto):-
一種非常天真的方法
setcallhook(function (event) local x = getinfo(2, 'nS') print(event, x.name, x.linedefined, x.source, clock()) end)
第一個改進是改用 C 編寫。第二個(但重要的)改進是在程式內執行大部分的運算,以減少輸出量(請參閱另一種方式)。
儘管程式很天真,但它確實可行。我經常使用它。當然,時鐘不是很精確,鉤子本身會影響所有時間,而結果可能龐大。但它仍然可以讓您對程式碼中的情況有個大概的概念。
另一種方式
local T = {} setcallhook (function (event) local f = getinfo(2, 'f').func local e = %T[f] if e == nil then local x = getinfo(2, 'nS') e = {name = x.name, line = x.linedefined, source = x.source, time = 0, count = 0} %T[f] = e end if event == 'call' then e.time = e.time - clock() e.count = e.count + 1 else e.time = e.time + clock() end end) -- You must call `dump' when your program ends function dump () setcallhook() -- cannot change `T' during traversal! for k,v in %T do print(v.name, v.line, v.source, v.count, v.time) end end
(同樣地,用 C 實做對您的程式影響較小。)