项目/libclock
更新于 2026/04/24
libclock
C++11 多后端单调时钟库,在统一 API 与低开销硬件计数器之间提供安全选择。
libclock 是一个面向性能敏感 C++ 代码的小型计时库。它把 libcpucycles、POSIX monotonic clock 和 std::chrono::steady_clock 放在统一接口下,同时保留直接访问具体 backend 的能力。
API 与后端
Clock提供统一的单调时间入口,TimePoint和Duration表达类型化时间差。StopWatch支持开始、暂停、恢复、重置和累计计时。ResolveClock()在进入 hot path 前完成一次后端选择,调用方随后可以使用具体类型的静态分派。CpuCyclesClock暴露原始 cycle counter、频率和 cycle delta 转换。- POSIX backend 支持
CLOCK_MONOTONIC、CLOCK_MONOTONIC_RAW与CLOCK_MONOTONIC_COARSE。 std::chrono::steady_clock作为可移植 fallback。
自动选择不会仅因为 CPU counter 可读就把它当作稳定时钟。Linux x86 需要 constant_tsc、nonstop_tsc 和内核 TSC clocksource;aarch64 也会区分可用于时间戳的 arch counter 与仅适合原始计数的 PMU backend。条件不满足时会回退到 clock_gettime 或 steady_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 不应直接比较;整数单位转换也会截断小数,并在溢出时饱和。