Lua 代码性能分析 |
|
以下是一些为 Lua 提供的性能分析器
您也可以通过 Lua 调试库 [1] 编写自己的性能分析器。
另请参阅 优化技巧。
[!] 版本说明: 以下代码适用于旧版 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 编写的代码对程序的影响要小得多。)