Lua程式設計 七十五)

2021-09-13 19:30:10 字數 1574 閱讀 8884

反射的另外乙個常見的用法是用以調優,即程式使用資源的分析。對於事件相關的調優,最好使用c介面,因為每次呼叫鉤子函式開銷太大從而可能導致測試結果無效。

效能調優工具的主要資料結構是兩個表,其中乙個表將函式和它們的呼叫計數關聯起來,另乙個表關聯函式和函式名。

local counters = {}

local names = {}

我們可以選擇在效能分析完成後再獲取函式的名稱,但是如果能在乙個函式f處於活動狀態時獲取其名稱會得到更好的結果。

現在,我們定義乙個鉤子函式,該鉤子的任務是獲取當前正在被呼叫的函式,並遞增相應的計數器,再收集函式名。

local function hook ()

local f = debug.getinfo(2, "f").func

local count = counters[f]

if count == nil then

counters[f] = 1

names[f] = debug.getinfo(2, "sn")

else

counters[f] = count + 1

endend

執行帶有鉤子的程式,假設我們要分析的程式位於乙個檔案中,且使用者通過引數把該檔名傳遞給效能分析器。

% lua  profiler main-prog
這樣,效能分析器就能從arg[1]中得到檔名,設定鉤子並執行檔案:

local f = assert(loadfile(arg[1]))

debug.sethook(hool, "c) --設定call時間的鉤子

f()debug.sethook()

我們通過函式getname來顯式結果

function getname (func)

local n = names[func]

if n.what == "c" then

return n.name

endlocal lc = string.format("[%s]:%d", n.short_src, n.linedefined)

if n.what ~= "main" and n.namewhat ~= "" then

return string.format("%s (%s)", lc, n.name)

else

return lc

endend

由於lua語言中的函式名並不是特別確定,所以我們給每個函式再加上位置資訊,以file:line這樣的形式給出。如果乙個函式沒有名稱,那麼就只使用它的位置。如果函式是c函式,那麼就只使用它的名稱。

for func, count in pairs(counters) do

print(getname(func), count)

end

(七十五)do while迴圈

do while和while for都不同。最大的不同在於 while和for,是先執行判斷,符合判斷,於是執行迴圈體。do while是先執行迴圈體,然後進行判斷,符合後,繼續執行迴圈體。do while至少執行一遍迴圈體。即for和while是入口迴圈體,do while是出口迴圈體。do wh...

Lua程式設計(十五)

修飾符?用於匹配乙個可選的字元,比如可以使用 d 來尋找乙個可能帶有符號的整數,像 12 24 123 等等。lua語言中的修飾符只能作用於乙個字元模式,無法作用於一組分類。以補字元 開頭的模式表示從目標字串的開頭開始匹配,而以 結尾的模式表示匹配到目標字串的結尾。和 只有在作用於模式的開頭和結尾時...

第七十五章

然而這聲慘叫彷彿只喊出半聲,便戛然而止,只見那團灰色濃霧,忽然如同實質般劇烈地蠕動了起來,隨後化成了一條條灰色的毒蛇,濃霧也隨之淡去了不少,在那濃霧的中心有著乙個身影,正是先前的索卡。緊隨著,濃霧中的那一幕讓得秦霄差點嘔了出來,只看那一條條細小灰色毒蛇,瘋狂地鑽進索卡的 之下,這般一來索卡渾身表面都...