Skip to content
重归混沌 edited this page Mar 18, 2020 · 3 revisions

Silly提供了一个针对lua代码的简易的性能分析器Profiler。

Profiler可以采样定义区域的进入次数,及时间开销。 本身提供了5个接口如下:

    profiler.start(name)
    profiler.stop(name)
    profiler.dump(name)
    profiler.yield(...)
    profiler.resule(...)

profiler.start/profiler.stop函数用于定义一个区域,通过name的值为此区域命名。

profiler.dump函数用于输入采样信息,调用profiler.dump支持有参数和无参数两种调用方式。

有参数时,仅返回通过参数指定的区域名的采样信息,可以类似如下代码来打印出采样信息。

    local info = profiler.dump("zone")
    print("zone", info.time, info.call)

其中info.time是指区域'zone'截止到profiler.dump函数之前,所花费的时间。 info.call是则是指区域'zone'截止到profiler.dump函数之前,所调用的次数。

还可以通过不传入任何参数来返回所有区域的采样信息,如:

    local info = profiler.dump()
    for k, v in pairs(info) do
            print(k, v.time, v.call)
    end

在采样代码中包含sleep或rpc call代码时, 仅靠以上三个函数所采样出的时间,会包含sleep的时间或rcp call的往返时间。

比如采样如下代码,得到的时间开销其实是lua代码的实际运行开销和sleep的时间之和:

    profiler.start("zone")
    --you lua code
    core.sleep(1000)
    --you lua code
    profiler.stop("zone")

如果要去掉如sleep这类并不实际消耗cpu的时间,需要通过如下代码 将profiler.yield/profiler.resume函数hook到coroutine.resume和coroutine.yield中去:

    local coresume = coroutine.resume
    local coyield = coroutine.yield
    coroutine.resume = function(...)
            profiler.resume(...)
            return coresume(...)
    end
    coroutine.yield = function(...)
            profiler.yield(...)
            return coyield(...)
    end
Clone this wiki locally