gpt4 book ai didi

c++ - 如何降低高分辨率(10 微秒)精确计时器的 CPU 使用率?

转载 作者:行者123 更新时间:2023-11-28 04:19:33 25 4
gpt4 key购买 nike

我正在使用 qt5 和 c++ 为 Windows 10 中的一些复杂通信应用程序编写一个计时器。我想在微秒分辨率下使用最多 3% 的 CPU。

最初我在此应用程序中使用了 qTimer (qt5)。低 CPU 使用率和开发人员友好的界面很好。但它并不像我需要的那样精确。它只需要毫秒作为参数,但我需要微秒。在许多现实世界的情况下,例如 cpu 负载过重,计时器的准确性并不等于此分辨率。有时计时器会在 1 毫秒时触发,有时会在 15 毫秒时触发。你可以在图片中看到这个问题:

enter image description here

我搜索了好几天的解决方案。但最后我发现 Windows 是一个非实时操作系统 (RTOS),没有提供高分辨率和精确的计时器。

我为此目标编写了自己的带有 CPU 轮询的高分辨率精确计时器。我开发了一个在单独线程中工作的单例类。它以 10 微秒的分辨率工作。

enter image description here

但是它消耗了 CPU 中的一个逻辑核心。相当于 ryzen 2700 的 6.25%。

enter image description here

对于我的应用程序,这种 CPU 使用率是 Not Acceptable 。 如何在不放弃高分辨率的情况下降低 CPU 使用率?

这是完成这项工作的代码:

void CsPreciseTimerThread::run()
{

while (true)
{
QMutexLocker locker(&mMutex);
for (int i=0;i<mTimerList.size();i++)
{
CsPreciseTimerMiddleLayer* timer = mTimerList[i];
int interval = timer->getInterval();
if ( (timer->isActive() == true&&timer->remainingTime()<0))
{
timer->emitTimeout();
timer->resetTime();
}
}



}
}

我试图降低计时器线程的优先级。我使用了这一行:

QThread::start(QThread::Priority::LowestPriority);

还有这个:

QThread::start(QThread::Priority::IdlePriority);

这种变化使计时器不那么精确,但 CPU 使用率并没有降低。

之后,我尝试强制当前线程在循环中休眠几微秒。

QThread::usleep(15);

正如您可能猜测的那样, sleep 功能确实搞砸了准确性。有时计时器休眠的时间比预期的长,例如 10 毫秒或 15 毫秒。

最佳答案

我将直接引用 Windows API 而不是 Qt 抽象。

我不认为你想降低你的线程优先级,我认为你想提高你的线程优先级并在轮询之间使用最少量的 sleep 来平衡延迟和 CPU 开销。

两个想法:

  1. 在 Windows Vista 中,他们引入了 Multimedia Class Scheduler Service特别是这样他们就可以将 Windows 音频组件移出内核模式并在用户模式下运行,而不会影响专业音频工具。这可能会对您有所帮助 - 它不能精确地保证“实时”,但它适用于低延迟操作。

  2. 采用经典方式 - 将您的进程和线程优先级提高到高或关键,同时使用几毫秒的合理 sleep ​​语句。也就是说,提高你的 thread priorityTHREAD_PRIORITY_TIME_CRITICAL。然后做一个很小的Sleep for 循环完成后。此 sleep 量应介于 0..10 毫秒之间。需要进行一些实验,但我不会超过下一次预期超时时间的一半,最多 10 毫秒。当您在计时器的 N 微秒内时,您可能需要旋转而不是屈服。需要进行一些实验。您还可以尝试提高您的 Process priorityREALTIME_PRIORITY_CLASS

小心 - 少数处于这些较高优先级且未处于休眠状态的失控进程和线程可能会锁定系统。

关于c++ - 如何降低高分辨率(10 微秒)精确计时器的 CPU 使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55785357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com