Windows用GetTickCount64获取系统运行毫秒数(休眠暂停),Linux读/proc/uptime第一字段得总秒数(含休眠),跨平台需分支处理并注意语义差异。

Windows 下用 GetTickCount64 最简单可靠
Windows 提供的 GetTickCount64 直接返回系统启动后经过的毫秒数,64 位无符号整型,不会溢出(对比已废弃的 GetTickCount),且精度足够日常使用(10–16ms 量级,取决于系统定时器分辨率)。
需要链接 kernel32.lib(VS 默认包含),头文件为 <windows.h></windows.h>:
#include <windows.h>
#include <iostream>
int main() {
ULONGLONG ms = GetTickCount64();
std::cout << "Uptime: " << ms / 1000.0 << " seconds\n";
}
- 返回值是毫秒,除以 1000.0 得秒;若需时分秒格式,自己做取模换算即可
- 该值在系统休眠期间是否继续计时?否——
GetTickCount64基于“系统运行时间”,休眠/睡眠时暂停累加 - 不依赖管理员权限,任意用户进程可调用
Linux 下读 /proc/uptime 是标准做法
Linux 内核通过 /proc/uptime 文件暴露两个空格分隔的浮点数:uptime_seconds 和 idle_seconds。前者就是你想要的系统启动后总运行秒数(含 CPU 空闲时间,即 wall-clock 时间)。
注意:这个值 包含休眠时间,和 Windows 的 GetTickCount64 语义不同。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- 用
std::ifstream读取该文件最轻量,无需额外库或 syscall - 路径固定为
/proc/uptime,所有主流内核都支持,无兼容性问题 - 文件内容形如
"123456.78 98765.43",只取第一个字段即可 - 权限宽松,普通用户可读,但需确保
/proc挂载正常(容器环境可能被挂载为只读或屏蔽)
跨平台封装要注意三件事
如果写 C++ 项目要同时支持 Windows/Linux,别直接宏套宏拼接逻辑,容易漏掉边界情况。
- 统一用
double返回秒数,避免整型溢出或精度丢失(比如 Linux 的 uptime 可达数百万秒) - Windows 分支必须用
GetTickCount64,GetTickCount在 49.7 天后回绕,极易引发线上故障 - Linux 分支建议加简单错误处理:若
open("/proc/uptime")失败(如容器没挂载/proc),应 fallback 到 0 或抛异常,而不是静默返回垃圾值
别用 clock_gettime(CLOCK_BOOTTIME) 除非真需要它
Linux 上 clock_gettime(CLOCK_BOOTTIME) 确实能获取包含休眠的绝对启动时间,但它不是所有 glibc 版本都默认启用(尤其旧嵌入式系统),且 Windows 完全不支持。
- 它的返回值是
struct timespec,需手动转成秒,比读/proc/uptime多两行代码 - 语义上和
/proc/uptime第一个字段一致,但多一层 syscall 开销,无实际优势 - 如果你已经在用
CLOCK_MONOTONIC做性能计时,别误以为CLOCK_BOOTTIME是它的“启动版”——两者用途不同,别混用
GetTickCount64,Linux 就读 /proc/uptime,跨平台就老实分支判断。最容易被忽略的是休眠行为差异:Windows 的值会停,Linux 的不会——这个语义差别会影响监控告警逻辑,别假设它们等价。

















