如何获取Lua脚本执行的百分比?

我在一个独立的任务中在C应用程序中运行Lua脚本,我添加了一个功能,以检查运行脚本的状态,如果它仍在运行或已完成。

如果是运行脚本,我想添加一些信息,我想添加从运行脚本执行的百分比,Lua是否支持任何信息。

我尝试使用Lua_debug中报告的信息,但它看起来不正确(像currentlin,definedline),我需要整个脚本的百分比,而不仅仅是针对特定函数的。

点赞
用户847349
用户847349

你可以设置一个debug hook,并监听hook事件:

Ideone

local script = [[
    print 'hello'
    print 'world'
    for i=0,3 do
        local answer = 42
    end
]]

local script_function = loadstring(script)

local function count_lines ()
    local count = 0
    for k,v in script:gmatch '\n' do count = count+1 end
    return count
end

local function trace(total_lines)
    local max_last_line = 0
    return function(info,line_number)
        if line_number > max_last_line then
            print(tostring(line_number/total_lines*100)..'%')
            max_last_line = line_number
        end
    end
end

local lines = count_lines()

local thread = coroutine.create( script_function )

debug.sethook(thread, trace(lines), "l")
coroutine.resume(thread)

输出:

20%
hello
40%
world
60%
80%
100%

但是需要注意的是,从这样的进度报告中获得有意义的数字仍然相当困难——如果你组织好了你的代码,并且仅有的一条语句是调用某种主函数,那么进度将会是100%,但是这个数字并不会表示任何有用的信息。你也可以跟踪行数并测量覆盖率,但是自然而然的,在执行中,100%的覆盖率并不是通常情况。你也可以尝试构建一个进度报告系统,并调用一个类似

ReportProgress( tasks / all_tasks )

的函数,该函数将会被绑定到C并生成必要的进度更新。

2013-12-10 12:25:54