【问题标题】:How to get the percentage of execution of a lua script?如何获取lua脚本的执行百分比?
【发布时间】:2013-12-11 15:47:35
【问题描述】:

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

我想在运行脚本的情况下添加一些信息,我想添加从运行脚本执行的百分比,Lua 是否支持此信息。

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

【问题讨论】:

  • 一旦您的脚本包含 if 或循环,您将很难获得有意义的百分比...
  • 我没问题,我不需要根据执行时间或指令来计算,我只需要粗略的(行数)
  • 您是否在问如何计算脚本在实际运行之前运行需要多长时间?对我来说,这听起来有点像停机问题。你怎么知道运行一个给定的脚本会永远完成?
  • 因此,如果您的脚本有 100 行,您想定期了解它当前所在的行吗?假设您没有循环只是一系列任务?不清楚您要做什么,也许提供一个文件示例和预期输出。
  • 从技术上讲,“整个脚本”一个特定的函数。它有参数和任意数量的返回语句。

标签: c lua


【解决方案1】:

你可以设置一个debug 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%

然而,要提到的是,从这样的进度报告中获得有意义的数字仍然相当困难——如果你组织你的代码并且最后唯一的语句是对某种 main 的调用,那么进度将是 100 %,而数字不代表任何有用的东西。您还可以跟踪行并测量覆盖率,但自然地,100% 的覆盖率并不是您在执行运行期间通常拥有的。您还可以尝试构建一个用于进度报告的系统并调用类似的函数

ReportProgress( tasks / all_tasks )

将绑定到 C 并生成必要的进度更新

【讨论】:

  • 感谢您的回答,但对我来说,我运行我无法控制的脚本文件,我的意思是我的应用程序的用户可以切换到运行任何脚本文件(他构建它们),在你实现它取决于脚本文件本身,我需要能够通过我的 C 应用程序和与 LUA 的接口来处理百分比以获得所需的信息
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2014-11-05
  • 2013-12-09
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多