基准测试模式
使用 os.clock 编写可靠的微基准测试,并避免常见问题。
基准测试模式 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
为什么要进行基准测试?
微基准测试会单独测量特定代码片段的性能。它可以帮助您验证优化是否确实提高了速度,而不是依赖直觉。
基本基准测试模板
将代码放入循环中,使用 os.clock() 测量实际耗时,然后除以迭代次数。
local N = 1e6
local t0 = os.clock()
for i = 1, N do
-- code to benchmark
end
local elapsed = os.clock() - t0
print(("%.2f ns/op"):format(elapsed / N * 1e9))预热运行
计时前先进行一次预热运行,让 LuaJIT 编译跟踪。没有预热时,第一次计时运行会包含 JIT 编译开销。
for i = 1, 1000 do hotFunction(i) end -- warm up
local t0 = os.clock()
for i = 1, N do hotFunction(i) end
local elapsed = os.clock() - t0防止死代码消除
对于结果未被使用的计算,JIT 可能会将其优化掉。请将结果累加到一个变量中,以确保基准测试结果可靠。
local sum = 0
for i = 1, N do sum = sum + math.sin(i) end
print(sum) -- prevent elimination比较两种方法
在完全相同的条件下测试不同的实现。交错运行它们,或多次运行它们,以尽量减少 OS 调度噪声。
local function approach1() -- ...
end
local function approach2() -- ...
end
local function bench(fn, n)
local t = os.clock()
for _ = 1, n do fn() end
return os.clock() - t
end
print("A:", bench(approach1, 1e5))
print("B:", bench(approach2, 1e5))统计分析
多次运行基准测试,并计算最小值、最大值和中位数。由 GC 暂停或 OS 调度造成的异常值应当舍弃。
内存基准测试
在测量耗时的同时测量内存分配。
collectgarbage("collect")
local mem0 = collectgarbage("count")
-- ... run operation ...
collectgarbage("collect")
local mem1 = collectgarbage("count")
print(("Memory delta: %.1f KB"):format(mem1 - mem0))避免 GC 干扰
计时前停止 GC,以测量纯计算耗时。计时后再恢复 GC。
collectgarbage("stop")
local t0 = os.clock()
for i = 1, N do -- ... end
print(os.clock() - t0)
collectgarbage("restart")真实场景基准测试与微基准测试
微基准测试适合优化小段代码,但可能无法反映真实场景中的性能。请始终根据完整应用的性能分析结果验证改进效果。
基准测试工具
构建一个可复用的 benchmark(name, fn, iters) 工具,让所有基准测试都输出格式统一、结果一致的报告。
local function benchmark(name, fn, iters)
iters = iters or 1e5
for _ = 1, iters // 10 do fn() end -- warm up
local t = os.clock()
for _ = 1, iters do fn() end
local ns = (os.clock() - t) / iters * 1e9
print(("%-30s %8.1f ns/op"):format(name, ns))
end持续集成中的基准测试
在持续集成中运行基准测试,以检测性能回归。如果基准测试性能下降超过指定阈值(例如 10%),则发出警报。
基准测试问题
对 LuaJIT 代码进行基准测试时,为什么预热运行很重要?
回顾:基准测试模式
先进行预热运行,通过使用结果防止死代码消除,使用 os.clock() 测量,控制 GC,并进行多次测试以获得稳定的测量结果。构建可复用的基准测试工具,以保持结果一致。
常见问题解答
「基准测试模式」课时是免费的吗?
是的 — 「基准测试模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「基准测试模式」这节课中我会学到什么?
使用 os.clock 编写可靠的微基准测试,并避免常见问题。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「基准测试模式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。