项目/libclock

更新于 2026/04/24

libclock

C++11 多后端单调时钟库,在统一 API 与低开销硬件计数器之间提供安全选择。

libclock 是一个面向性能敏感 C++ 代码的小型计时库。它把 libcpucycles、POSIX monotonic clock 和 std::chrono::steady_clock 放在统一接口下,同时保留直接访问具体 backend 的能力。

API 与后端

  • Clock 提供统一的单调时间入口,TimePointDuration 表达类型化时间差。
  • StopWatch 支持开始、暂停、恢复、重置和累计计时。
  • ResolveClock() 在进入 hot path 前完成一次后端选择,调用方随后可以使用具体类型的静态分派。
  • CpuCyclesClock 暴露原始 cycle counter、频率和 cycle delta 转换。
  • POSIX backend 支持 CLOCK_MONOTONICCLOCK_MONOTONIC_RAWCLOCK_MONOTONIC_COARSE
  • std::chrono::steady_clock 作为可移植 fallback。

自动选择不会仅因为 CPU counter 可读就把它当作稳定时钟。Linux x86 需要 constant_tscnonstop_tsc 和内核 TSC clocksource;aarch64 也会区分可用于时间戳的 arch counter 与仅适合原始计数的 PMU backend。条件不满足时会回退到 clock_gettimesteady_clock

集成与边界

项目提供 GoogleTest 单元测试、CMake install 和 find_package(libclock CONFIG REQUIRED) 支持。核心库不强制依赖 glog 或 gflags,日志通过可选 callback 交给调用方。GitHub Actions 使用 Ninja 完成 Release 构建和测试。

项目目前没有 release,也没有声明开源许可证。公开源码不等于获得复制、修改或分发授权。

CpuCyclesClock::NowNanos() 是根据 cycle frequency 换算的估计值,不是 wall clock。不同 clock source 或不同实例产生的 TimePoint 不应直接比较;整数单位转换也会截断小数,并在溢出时饱和。

相关阅读

Memo微架构分析工具Memo关闭侧信道攻击缓解,make Linux great again!Memotime-warp-test.c: check TSC synchronity on x86 CPUs