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

使用C++ chrono库时执行时间与挂钟时间不符的问题排查

问题分析与修复

你的代码存在两个关键问题,导致计时器触发间隔远超预期:

1. prev的更新逻辑错误

循环末尾你重新调用chrono::high_resolution_clock::now()来更新prev,这会让下一轮计算的delta变成当前循环结束时间到下一轮开始时间的间隔,相当于每轮循环的时间差被重复计算了一次,直接导致计时器递减速度减半,最终触发间隔翻倍。

正确的做法应该是将prev设置为当前循环开头获取的current,这样delta才是两次循环迭代之间的真实时间间隔。

2. 初始计时器单位错误

你初始化timer时用了std::chrono::nanoseconds{3},这表示3纳秒而非3秒——虽然后续重置时修正为3秒,但第一次计时器会瞬间耗尽,不过这不是间隔翻倍的核心原因。


修复后的代码

#include<iostream>
#include<chrono>

using namespace std;
using namespace std::chrono;

int main(int argc, char* argv[])
{
    auto prev = chrono::high_resolution_clock::now();
    auto timer = chrono::seconds{3}; // 直接初始化为3秒,避免初始无效计时

    cout << "Start Loop" << endl;

    while(true)
    {
        auto current = chrono::high_resolution_clock::now();
        auto delta = current - prev; // 直接计算时间差,chrono会自动处理单位

        if(timer <= chrono::nanoseconds::zero())
        {
            timer = chrono::seconds{3};
            cout << "Timer complete! New time: " << timer.count() << endl;
        } else {
            timer -= delta; // 直接用时间差递减,无需手动构造duration对象
        }
        
        prev = current; // 用当前循环起始时间更新prev,而非重新获取新时间
    }
    return 0;
}

额外优化说明

  • 无需手动将时间差转换为nanoseconds,current - prev返回的duration对象可直接与timer运算,chrono库会自动处理单位转换。
  • 简化变量初始化逻辑,减少冗余的时间点获取操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:33:20