【语法算法】
CPU 时间和墙钟时间的分界就这两行:
local cpuStart = os.clock()
local wallStart = os.time()
os.clock 返回 CPU 时间——程序实际占用处理器的秒数——os.time 返回墙钟时间——从某个固定时间点到现在的秒数。两者单位相同但语义完全不同。今天拆开。
一、CPU、墙钟、分界三段
两种时间的三段。CPU 时间:程序实际消耗的处理器时间——不包括等待 IO、等待网络、sleep 的时间——CPU 时间在 sleep 时不走。墙钟时间:从某个固定时间点到现在的实际秒数——包括等待、睡眠、一切——墙钟时间就是"你看墙上的钟走了多少秒"。分界:CPU 时间衡量的是"程序多忙",墙钟时间衡量的是"过了多久"——两者的差值就是"程序在等待"的时间。三段连起来:两种时间的分界线就是"是否包含等待"——CPU 时间不含等待,墙钟时间含所有——性能分析看 CPU,业务逻辑看墙钟。
graph TD
A["os.clock() → CPU时间"] --> B["程序忙 → 时间走"]
A --> C["sleep/IO → 时间停"]
D["os.time() → 墙钟时间"] --> E["不管忙闲 → 时间走"]
B --> F["CPU时间 < 墙钟时间"]
E --> F
二、两种时间的正确写法
-- CPU时间: 计算函数执行耗时
local cpuStart = os.clock()
heavyComputation()
local cpuEnd = os.clock()
print("CPU耗时:", cpuEnd - cpuStart)
-- 墙钟时间: 计算业务间隔
local wallStart = os.time()
SL:ScheduleNextDay(function()
local wallEnd = os.time()
print("实际间隔:", wallEnd - wallStart, "秒")
end)
os.clock 的精度是 CPU 时间的核心优势——精度通常达到微秒级——适合精确测量函数耗时——os.time 的精度是秒级——适合业务逻辑的时间间隔计算。
三、CPU 的分界与墙钟的坑
CPU 时间和墙钟时间的分界线就是"是否包含等待"——纯计算用 CPU 时间,含 IO 或等待用墙钟时间——两者的选择就是性能分析的第一步。墙钟时间的坑也在时区:os.time 返回的是 UTC 时间戳——os.date 默认输出本地时间——os.clock 返回的是进程启动以来的 CPU 秒数——三个函数三种参照系——混用参照系是时间 bug 的万恶之源。最后一条纪律:os.clock 的返回值不是 Unix 时间戳——它是"程序启动以来消耗的 CPU 秒数"——起始点不确定,跨进程比较没有意义——os.clock 只适合测量程序内部的相对耗时。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 数值组出过一次结算事故:斩残纹上线首日,满血的怪挨了最重的刀——按设计它该是最轻的那一刀。排查下来是加成算错了…
【游戏功能】 defQ=Math.min(30,defQ+6) ——先拆这一行。逆纹把重刀分期,每一拍记一笔挂账,但挂账不能…
【游戏功能】 上一版留了个只在你自己的房间里能复现的怪事:双生纹在怪倒下的那一帧偶尔整个消失——不跳、不报错、日志干净。翻了…
【游戏功能】 先抛一个坑:两只怪为什么只打你?它们的同伴就站在旁边,刀却一爪一爪全落你身上——仇恨锁死在玩家身上,怪和怪之间…
【游戏功能】 前阵子出过一场投诉事故:一个玩家连着七刀全是最小值,气得在世界频道喊"这纹出老千"。运营翻了账,七刀的点数真真…
【游戏功能】 P.hp=Math.max(5,P.hp-3) ——先拆这一行。反噬纹每秒要从血条里抽三点,但抽到见底会把人抽…