剖析 Lua 程式碼

lua-users home
wiki

Lua 剖析器

以下是 Lua 所提供的剖析器

您也可以透過 Lua Debug 函式庫撰寫自己的剖析器 [1]

另請參閱 OptimisationTips

較舊的 Lua 4 範例

[!] 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 實做對您的程式影響較小。)


RecentChanges · preferences
edit · history
最近編輯於 2021 年 1 月 18 日,格林威治標準時間晚上 11:51 (diff)