-
Notifications
You must be signed in to change notification settings - Fork 16
Profiler
重归混沌 edited this page Dec 8, 2016
·
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
printf(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