首选跨平台毫秒级时间获取是std::chrono::steady_clock::now(),因其自动适配windows的queryperformancecounter和posix的clock_monotonic,单调不跳变,且需用duration_cast转换而非直接除法,避免精度丢失。

为什么 std::chrono::steady_clock::now() 是首选
跨平台毫秒级时间获取,最可靠的方式就是用 C++11 起标准库提供的 std::chrono。它底层自动适配 Windows 的 QueryPerformanceCounter 和 POSIX 系统的 clock_gettime(CLOCK_MONOTONIC),无需手动条件编译,也避开 gettimeofday(已废弃)或 timeGetTime(Windows 专属、精度受限)的问题。
关键点在于必须用 steady_clock,而不是 system_clock:前者是单调递增、不受系统时钟调整影响;后者可能因 NTP 校正跳变,不适合测时长。
常见错误是直接对 time_point 做减法后除以 1000 —— 这会丢失精度或触发整数截断。正确做法是用 duration_cast 显式转换。
怎么写一个安全的毫秒整数获取函数
返回 long long 毫秒数(避免 int 溢出),且保证跨平台行为一致:
long long now_ms() {
auto now = std::chrono::steady_clock::now();
return std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();
}</:chrono::milliseconds>
说明:
-
time_since_epoch()返回从时钟起点到现在的duration,类型依赖实现但语义稳定 -
duration_cast是唯一可移植的精度转换方式;用.count()取整数值,不推荐.count() / 1000.0(引入浮点误差) - 该函数无副作用、无异常、无动态分配,适合高频调用(如游戏循环、日志打点)
如果需要高精度差值(比如测函数耗时),别用绝对毫秒
直接取两次 now_ms() 相减,看似简单,但存在两个隐患:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 毫秒截断导致亚毫秒级差异归零(例如 1.2ms → 1ms,1.8ms → 1ms,差值为 0)
- 不同平台的
steady_clock分辨率不同(Linux 通常纳秒级,Windows 可能 15ms 左右,取决于硬件)
更稳妥的做法是用 duration 做运算,最后再转毫秒(带小数或四舍五入):
auto start = std::chrono::steady_clock::now(); // ... work ... auto end = std::chrono::steady_clock::now(); auto ms = std::chrono::duration<double std::milli>(end - start).count(); // double 毫秒,保留小数</double>
或者要整数毫秒且四舍五入:
auto ms_rounded = std::chrono::duration_cast<:chrono::milliseconds>(end - start).count();</:chrono::milliseconds>
Windows 上 QueryPerformanceCounter 不可靠?其实不是问题
有人担心 steady_clock 在旧版 Windows(如 XP)上 fallback 到低精度 API。现代编译器(MSVC 2015+、Clang/LLVM、GCC via mingw-w64)均已确保 steady_clock 使用 QueryPerformanceCounter,且处理了频率翻倍等已知 bug。
真正要注意的是:不要自己封装 QPC —— 它需要调用 QueryPerformanceFrequency 并做除法,容易因整数溢出或未处理频率变化而出错。标准库已封装好这些细节。
验证方法:在 Windows 上打印 std::chrono::steady_clock::period::den / std::chrono::steady_clock::period::num,通常得到约 10⁹(纳秒级),说明底层确实是高精度计数器。
跨平台时间获取的复杂点不在“怎么写”,而在“怎么用”——尤其是是否混淆了绝对时间与相对时长、是否误信整数毫秒能满足所有精度需求。实际项目里,90% 的误用都发生在把 now_ms() 当作高精度时钟源去算微秒级差值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










