Windows用GetTickCount64最快最准;Linux/macOS须用sysinfo或clock_gettime(CLOCK_BOOTTIME),std::chrono::steady_clock不能替代系统uptime因其起点非开机时刻且不保证对齐。

Windows 下直接用 GetTickCount64 最快最准;Linux/macOS 必须用 sysinfo 或 clock_gettime(CLOCK_BOOTTIME),std::chrono 本身不提供系统 uptime —— 它只管进程或线程的时钟,别误用。
为什么 std::chrono::steady_clock 不能当 uptime 用
std::chrono::steady_clock 是单调递增的硬件计时器,但它的起点是“进程启动时”或“系统启动后某次初始化时刻”,不是系统开机时刻。它可能被内核重置、受 NTP 调整影响(尽管 steady 理论上不受),更关键的是:它不保证与系统 uptime 对齐。
常见误用现象:
– 在服务进程里跑几小时,steady_clock::now() 差值 ≈ 进程运行时间,≠ 系统已运行时间
– 容器环境里,steady_clock 起点常是容器启动时刻,和宿主机 uptime 完全无关
实操建议:
– 别用 steady_clock 或 system_clock 去减开机时间算 uptime
– 若只需进程存活时长,用 steady_clock 没问题;但要系统级 uptime,必须走系统 API
立即学习“C++免费学习笔记(深入)”;
Windows:优先用 GetTickCount64,别碰 GetTickCount
GetTickCount64 返回毫秒级 uptime,64 位无回绕(GetTickCount 是 32 位,49.7 天就溢出),且调用开销极低(用户态读取 KUSER_SHARED_DATA)。
使用场景:
– 监控程序需高频采样 uptime(如每秒一次)
– 游戏/音视频同步需要低延迟、高精度的系统运行基准
注意事项:
– 需 #include <windows.h></windows.h>,链接 kernel32.lib(通常默认)
– 返回值类型是 ULONGLONG,别强制转成 int 或 DWORD
– 不受系统休眠影响(从 Windows Vista 起,该值在休眠期间暂停计数)
示例:
ULONGLONG uptime_ms = GetTickCount64(); double uptime_sec = uptime_ms / 1000.0;
Linux:用 sysinfo 最兼容,clock_gettime(CLOCK_BOOTTIME) 更精确
sysinfo 是传统接口,返回结构体中的 uptime 字段(单位:秒),glibc 封装良好,所有内核版本都支持。但精度只有秒级,且包含休眠时间(即“挂起期间也计时”)。
clock_gettime(CLOCK_BOOTTIME) 返回纳秒级绝对时间,起点是系统启动(含休眠),精度高、无歧义,但要求内核 ≥ 2.6.39 + glibc ≥ 2.12。若目标环境老旧,慎用。
容易踩的坑:
– CLOCK_MONOTONIC 不包含休眠时间,和 GetTickCount64 行为不一致
– /proc/uptime 文本解析慢、有 IO 开销,不适合高频读取
– 忘记检查 clock_gettime 返回值:失败时返回 -1,errno 设为 EINVAL(如内核不支持该 clockid)
示例(sysinfo):
struct sysinfo info;
if (sysinfo(&info) == 0) {
time_t uptime_sec = info.uptime;
}
跨平台封装要注意的三个硬约束
没有银弹函数能同时满足 Windows/Linux/macOS 的 uptime 获取需求,封装时必须明确边界:
– 时间单位统一用秒或毫秒(推荐 double 秒,避免整数溢出)
– 明确是否计入休眠:Windows GetTickCount64 不计,Linux CLOCK_BOOTTIME 计,sysinfo 也计 —— 接口文档里必须写死语义
– 错误处理不能忽略:Linux 下 sysinfo 可能因权限失败(极少见),clock_gettime 可能不支持 clockid,Windows 下则基本不会失败
macOS 额外提醒:
– 没有 GetTickCount64 等价物
– 只能靠 sysctl(KERN_BOOTTIME) 拿开机时间再减 time(NULL),但结果不含休眠时间,和 Windows 行为也不对齐
– 第三方库如 libuptime 往往只是包装了这层计算,别以为它“跨平台就等于行为一致”


















