0Pricing
Lua Academy · 课时

使用 LuaProfiler 进行性能分析

使用 LuaProfiler 为代码添加检测,以查找 CPU 热点和调用次数。

使用 LuaProfiler 进行性能分析 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

什么是 LuaProfiler

LuaProfiler 是 Lua 的基于钩子的性能分析器。它会记录函数调用次数和每个函数累计花费的时间,并生成用于优化分析的报告。

安装 LuaProfiler

可通过 LuaRocks 获取:luarocks install luaprofiler。或者直接将源代码包含在项目中。

启动性能分析器

使用性能分析器的 start/stop 调用包裹您的代码。

local profiler = require("profiler")
profiler.start("profile.txt")  -- output to file
-- ... your code ...
profiler.stop()

阅读报告

报告会显示:函数名称、调用次数、每次调用耗时和总耗时。请重点关注总耗时较高的函数。

-- Example report:
-- function          calls  total_time  avg_time
-- hotLoop          1000   0.850 s     0.850 ms
-- table.sort        200   0.120 s     0.600 ms
-- string.format    5000   0.090 s     0.018 ms

分析特定代码路径的性能

只分析代码中的一部分,以降低开销并让报告更聚焦。

profiler.start()
doExpensiveOperation()
profiler.stop()
profiler.report("expensive_op.txt")

替代方案:使用 debug.sethook 自定义性能分析器

使用 debug.sethook 构建一个最小化性能分析器,在不依赖外部库的情况下收集调用次数。

local counts = {}
debug.sethook(function(event)
  if event == "call" then
    local info = debug.getinfo(2, "n")
    local name = info.name or "?"
    counts[name] = (counts[name] or 0) + 1
  end
end, "c")
-- ... run code ...
debug.sethook()
for name, count in pairs(counts) do
  print(count, name)
end

使用 os.clock 统计函数耗时

手动统计单个函数的耗时,以便快速进行有针对性的基准测试。

local function time(fn, ...)
  local t = os.clock()
  fn(...)
  return os.clock() - t
end
print("myFunc took:", time(myFunc, arg1, arg2))

使用 jit.p 分析 LuaJIT 性能

在 LuaJIT 上,jit.p 比基于钩子的性能分析器更适合生产环境使用:开销更低,并且支持感知即时编译器的采样。

火焰图

通过收集栈采样生成火焰图。工具包括:用于 PUC Lua 的 lua-flameprof,以及用于 LuaJIT 的 jit.p + FlameGraph。火焰图会显示 CPU 使用情况的完整调用层级。

在测试套件中进行性能分析

在单元测试中运行性能分析器,以自动捕获性能回退。断言热点函数的耗时不超过阈值。

常见热点

  • 循环中使用 .. 进行字符串连接(使用 table.concat)。
  • 对大型表使用 table.sort(可以考虑更快的算法)。
  • 频繁创建闭包。
  • 较深的元表 __index 链。

性能分析问题

LuaProfiler 报告会显示什么?

回顾:使用 LuaProfiler 进行性能分析

使用 LuaProfiler 或自定义的 debug.sethook 性能分析器收集调用次数和耗时。重点关注总耗时较高的函数。在 LuaJIT 上优先使用 jit.p。使用火焰图可视化调用层级。

常见问题解答

「使用 LuaProfiler 进行性能分析」课时是免费的吗?

是的 — 「使用 LuaProfiler 进行性能分析」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「使用 LuaProfiler 进行性能分析」这节课中我会学到什么?

使用 LuaProfiler 为代码添加检测,以查找 CPU 热点和调用次数。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 LuaProfiler 进行性能分析」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 深入了解 debug 库
  2. 使用 MobDebug 进行远程调试
  3. 使用 LuaProfiler 进行性能分析
  4. 代码覆盖率和测试检测
← 返回 Lua Academy