c++ - c ++ while循环计时器的准确性变化很大
问题描述
我正在尝试使用一个while循环来创建一个持续测量3000μs(3 ms)的计时器,虽然它大部分时间都在工作,但其他时候计时器可能会延迟多达500μs。为什么会发生这种情况,有没有更精确的方法来制作这样的计时器?
int getTime() {
chrono::microseconds μs = chrono::duration_cast< chrono::microseconds >(
chrono::system_clock::now().time_since_epoch() //Get time since last epoch in μs
);
return μs.count(); //Return as integer
}
int main()
{
int target = 3000, difference = 0;
while (true) {
int start = getTime(), time = start;
while ((time-start) < target) {
time = getTime();
}
difference = time - start;
if (difference - target > 1) { //If the timer wasn't accurate to within 1μs
cout << "Timer missed the mark by " + to_string(difference - target) + " microseconds" << endl; //Log the delay
}
}
return 0;
}
我希望这段代码能够记录始终在 5 μs 左右的延迟,但控制台输出看起来像这样。
编辑澄清:我在 Windows 10 Enterprise Build 16299 上运行,但该行为在 Debian 虚拟机上仍然存在。
解决方案
您还需要考虑其他正在运行的进程。操作系统可能会抢占您的进程以将 CPU 时间分配给其他进程/线程,并且会不确定地将控制权返回给运行此计时器的进程/线程。
当然,当我们考虑实时操作系统或平面调度程序时,这并不是 100% 正确的。但是,如果您在通用机器上运行,您的代码可能就是这种情况。
推荐阅读
- python - 如何通过 django python 中的子进程运行 unoconv?
- ruby-on-rails - 在我的 Rails 应用程序中添加一种查看未来 7 天内到期的作业的方法
- kotlin - 如何在外部(ini)函数中初始化不可变类成员
- javascript - 使用猫鼬时如何不通过函数传递值
- amazon-web-services - AWS Beanstalk 驱动器已满?
- java - 使用 Docker 打包 Maven
- r - 有没有办法计算ecdf的面积?
- javascript - 使用 user_id 的 javascript 对象过滤器不返回预期结果
- angular - Angular 8:使 FormBuilder 仅接受带有纬度和经度范围的数字
- c# - 无法在 .NET Core 3.0 中使用 AssemblyLoadContext 加载插件依赖项