反射的另外乙個常見的用法是用以調優,即程式使用資源的分析。對於事件相關的調優,最好使用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語言中的修飾符只能作用於乙個字元模式,無法作用於一組分類。以補字元 開頭的模式表示從目標字串的開頭開始匹配,而以 結尾的模式表示匹配到目標字串的結尾。和 只有在作用於模式的開頭和結尾時...
第七十五章
然而這聲慘叫彷彿只喊出半聲,便戛然而止,只見那團灰色濃霧,忽然如同實質般劇烈地蠕動了起來,隨後化成了一條條灰色的毒蛇,濃霧也隨之淡去了不少,在那濃霧的中心有著乙個身影,正是先前的索卡。緊隨著,濃霧中的那一幕讓得秦霄差點嘔了出來,只看那一條條細小灰色毒蛇,瘋狂地鑽進索卡的 之下,這般一來索卡渾身表面都...