最可靠方案是 std::chrono::high_resolution_clock,取两次时间点相减并用 duration_cast 转换为纳秒等单位;避免 system_clock(受 NTP 影响)和 clock()(Windows 精度仅 15ms);需排除编译器优化、CPU 频率调节、缓存未预热等干扰。
用 std::chrono 高精度计时最可靠
Windows 下的 clock() 和旧式 time() 精度低、易受系统负载干扰,Linux 下还可能返回错误值;std::chrono 是 C++11 起标准库提供的跨平台高精度方案,推荐无脑用它。
核心思路:取两次时间点,转成统一单位后相减。常用组合是 std::chrono::high_resolution_clock(实际通常映射到系统最高精度时钟):
#include auto start = std::chrono::high_resolution_clock::now(); // 你的代码 auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(end - start).count();
-
nanoseconds、microseconds、milliseconds按需选,别直接用count()不加转换——返回的是“时钟滴答数”,不是毫秒 - 避免用
std::chrono::system_clock测执行时间,它反映的是挂钟时间,可能因 NTP 校时跳变 - 单次测量意义不大,尤其短代码;建议循环多次取平均,或用
std::chrono::steady_clock(更强调单调性)
clock() 在什么情况下还能凑合用
仅适用于粗略评估 CPU 时间占比,比如调试算法复杂度趋势,且只在 Linux + GCC 或 Windows + MSVC 的简单控制台程序里勉强可用。
- 返回的是进程累计 CPU 时间(单位是
CLOCKS_PER_SEC),对多线程不敏感,也不含系统调用等待耗时 - Windows 下
clock()实际精度只有 ~15ms,测不到微秒级差异 - 必须除以
CLOCKS_PER_SEC才得秒数,常见漏写导致结果大出 100 万倍 - 示例:
double ms = (clock() - start) * 1000.0 / CLOCKS_PER_SEC;
Windows 专用但更准的 QueryPerformanceCounter
当需要比 std::chrono 更底层控制,或兼容极老 C++ 编译器(如 VC6)时才考虑。它绕过 C++ 标准库,直读硬件计数器,精度可达纳秒级。