使用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
相关产品推荐
相关产品推荐

