2013-03-31 66 views
4

我剛剛開始與Lua作爲學校作業的一部分。我想知道是否有簡單的方法來實現Lua分析?我需要顯示分配的內存,使用的變量而不管其類型等。簡易Lua分析

我一直在找到C++解決方案,我已經能夠成功編譯但我不知道如何將它們導入到Lua環境。

我也找到了Shinny,但我找不到任何有關如何使其工作的文檔。

+0

你檢查[LUA用戶]( http://lua-users.org/wiki/ProfilingLuaCode)? – hjpotter92

回答

3

有幾個profilers available,您可以檢查,但其中大多數目標執行時間(並基於調試掛鉤)。

要追蹤變量,您需要使用debug.getlocaldebug.getupvalue(從您的代碼或調試鉤子)。

要跟蹤內存使用情況,您可以使用collectgarbage(count)(可能在collectgarbage(collect)之後),但這隻會告訴您正在使用的內存總量。要跟蹤各個數據結構,您可能需要遍歷全局變量和局部變量,並計算它們佔用的空間量。你可以查詢this discussion瞭解一些指針和實現細節。

像這樣的事情將是跟蹤函數調用/返回(請注意,你不應該相信絕對數字它產生,只是相對的)最簡單的探查:

local calls, total, this = {}, {}, {} 
debug.sethook(function(event) 
    local i = debug.getinfo(2, "Sln") 
    if i.what ~= 'Lua' then return end 
    local func = i.name or (i.source..':'..i.linedefined) 
    if event == 'call' then 
    this[func] = os.clock() 
    else 
    local time = os.clock() - this[func] 
    total[func] = (total[func] or 0) + time 
    calls[func] = (calls[func] or 0) + 1 
    end 
end, "cr") 

-- the code to debug starts here 
local function DoSomethingMore(x) 
    x = x/2 
end 

local function DoSomething(x) 
    x = x + 1 
    if x % 2 then DoSomethingMore(x) end 
end 

for outer=1,100 do 
    for inner=1,1000 do 
    DoSomething(inner) 
    end 
end 

-- the code to debug ends here; reset the hook 
debug.sethook() 

-- print the results 
for f,time in pairs(total) do 
    print(("Function %s took %.3f seconds after %d calls"):format(f, time, calls[f])) 
end 
+0

Woa!謝謝!有沒有一種方法可以編輯此代碼來計算自設置掛鉤後已聲明瞭多少個變量? –

+0

您可能需要檢查'debug.getlocal'和'debug.getupvalue'函數。這個SO答案可能是有用的:http://stackoverflow.com/questions/2834579/print-all-local-variables-accessible-to-the-current-scope-in​​-lua。如果您想知道某些時刻以後設置了什麼,則可能需要拍攝兩張快照並進行比較。 –