You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否单次调用同时获取CLOCK_REALTIME与CLOCK_MONOTONIC以减小时差

单次调用同时获取两类时钟时间的实现方案

标准POSIX规范定义的clock_gettime()接口本身不支持单次调用返回多个不同时钟的时间戳,原生没有提供对应的能力,不过可以根据你的运行平台选择不同方案降低两次调用的时间差:

  • 通用平台优化方案
    如果没有特殊的平台依赖,可以采用单调时钟包夹调用的方式缩小时间戳的对应误差:
    clock_gettime(CLOCK_MONOTONIC, &tsp_before);
    clock_gettime(CLOCK_REALTIME, &tsp2);
    clock_gettime(CLOCK_MONOTONIC, &tsp_after);
    // 取前后两次单调时钟的平均值作为和tsp2对应的单调时间,误差控制在两次调用间隔的1/2以内
    tsp1.tv_sec = (tsp_before.tv_sec + tsp_after.tv_sec) / 2;
    tsp1.tv_nsec = (tsp_before.tv_nsec + tsp_after.tv_nsec) / 2;
    if (tsp1.tv_nsec >= 1000000000) {
        tsp1.tv_sec += 1;
        tsp1.tv_nsec -= 1000000000;
    }
    
    这种方案不需要依赖特定内核或库版本,适配性最强,大部分场景下的误差都能满足需求。
  • Linux平台低开销方案
    如果你使用的是Linux系统,绝大多数发行版的glibc都已经实现了clock_gettime()的vDSO加速,两次调用都在用户态完成,没有内核态切换开销,本身的时间差就只有几纳秒量级,普通场景下不需要额外优化。
    如果对时间差要求极高,可以使用Linux 5.1及以上版本支持的io_uring接口,批量提交两个时钟的获取请求,仅需一次用户态和内核态的交互就能拿到两个时间戳,相比两次单独调用的时间差可以降低70%以上。

内容的提问来源于stack exchange,提问作者kantal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:24:03