c++oding="utf-8" ?>
应使用clock_gettime(CLOCK_MONOTONIC, ...)获取系统启动后CPU持续运行时间,因其单调递增、不受NTP或手动调时影响;Windows对应GetTickCount64();/proc/uptime不等于CPU执行时间,仅表墙钟运行时长。

用 clock_gettime(CLOCK_MONOTONIC, ...) 获取高精度、无跳变的运行时间
系统启动后 CPU 持续运行的时间(即“uptime”),不能靠 time() 或 std::chrono::system_clock —— 它们反映的是挂钟时间,受 NTP 调整、时区、手动改时间影响,会回跳或跳变。CLOCK_MONOTONIC 才是唯一可靠选择:它从系统启动开始单调递增,不受外部时间干预。
实操要点:
-
clock_gettime()需要链接-lrt(Linux)或默认可用(较新 glibc / musl);macOS 用CLOCK_UPTIME_RAW替代,但接口一致 - 返回值单位是纳秒,转成秒需除以
1e9,推荐用double或std::chrono::nanoseconds转换,避免整数截断 - 不要用
CLOCK_BOOTTIME——它包含系统挂起时间(suspend),而 CPU 运行时间在 suspend 期间应暂停计数;CLOCK_MONOTONIC正好满足这点
#include <time.h>
#include <iostream>
double get_uptime_seconds() {
struct timespec ts;
if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
return ts.tv_sec + ts.tv_nsec / 1e9;
}
return -1.0; // error
}
</iostream></time.h>
Windows 上用 GetTickCount64(),不是 GetTickCount()
Windows 没有 clock_gettime,最直接对应的是 GetTickCount64():返回自系统启动以来的毫秒数,64 位无溢出风险(GetTickCount() 是 32 位,约 49.7 天就回绕,极易出错)。
注意点:
-
GetTickCount64()精度通常为 10–16ms,取决于系统 timer resolution;如需更高精度,得用QueryPerformanceCounter(),但需额外做频率换算,且不保证跨平台语义一致 - 它等价于 Linux 的
CLOCK_MONOTONIC(不计 suspend 时间),不是GetSystemTimeAsFileTime()(那是挂钟) - 头文件是
,无需额外链接库
跨平台封装时,别直接依赖 std::chrono::steady_clock::now()
看起来很美:std::chrono::steady_clock 标准要求“monotonic”,但实际行为因实现而异。libstdc++(GCC)底层用 CLOCK_MONOTONIC,MSVC 在较新版本也映射到 GetTickCount64(),但旧版 MSVC 或某些嵌入式 STL 可能退化为低精度或非稳态实现。
稳妥做法:
- 优先手写条件编译调用原生 API(如上两节),控制精度和语义
- 若必须用
std::chrono,至少加运行时校验:连续两次now()调用结果不应递减;并记录首次调用值作偏移基准 - 避免把
steady_clock::duration直接当“系统 uptime 秒数”用——它只保证单调,不代表从 boot 开始
常见误判:/proc/uptime 的值 ≠ CPU 运行时间(对多核系统)
Linux 下读 /proc/uptime 得到的是“系统已运行秒数”,但它反映的是 wall-clock uptime(含 suspend),且**不是 CPU 时间总和**。有人误以为它等于所有 CPU 核心运行时间之和,其实不然:该文件内容本质是 CLOCK_BOOTTIME 的秒数近似值,与 CPU 是否空闲、是否 suspend 无关。
真正需要“CPU 总执行时间”(比如计算利用率),该看 /proc/stat 中 cpu 行各列累加值,再除以 sysconf(_SC_CLK_TCK);但那是 jiffies,不是 wall-clock 秒数。
所以,如果你的目标只是“系统开了多久”,/proc/uptime 可读,但不如 clock_gettime(CLOCK_MONOTONIC, ...) 精确可控;如果目标是“CPU 执行了多少秒”,那得换指标,别混用。
跨平台代码里最容易被忽略的,是 Windows 和 Linux 对“suspend 期间是否计时”的默认分歧——看似都叫 uptime,底层语义却差了一层抽象。动手前先确认你到底要物理时间流逝,还是要 CPU 实际工作累积量。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











