在我的程序中,我目前正在尝试实现芯片寄存器的实时更新。这个实时更新必须是一定的间隔,60hz和120hz是常见的,但如果可能200hz会更好。
无论如何,我想优化我的循环,因为速度至关重要。要查看慢速部件的位置,我使用QElapsedTimer来测量经过的纳秒数。我目前仍然坚持,看起来,Qt中for / while循环的大量开销。
代码:
QElapsedTimer outsideloop;
QElapsedTimer insideloop;
int totalinside = 0;
outsideloop.start();
while(x<reg.size())
{
insideloop.start();
//get registers from chip
//process register values
x++;
totalinside+= insideloop.nsecsElapsed();
}
qDebug()<<"Time elapsed Outside:"<<outsideloop.nsecsElapsed();<<"inside:"<<totalinside;
现在,仅在循环“内部”的时间通常比在循环“外部”测量的时间少约4-5毫秒。举个例子,“内部”通常测量大约5ms,但外部通常测量大约10ms。有时差异较小(1ms),有时甚至更大(15-30ms)。当我使用for循环时,这种差异也存在。
另外,我测量了进入和退出循环所需的时间:
nstimer.start();
while(x<reg.size())
{
qDebug()<<"Time to get into loop"<<nstimer.nsecsElapsed();
nstimer.start();
}
qDebug()<<"Time to get out of loop"<<nstimer.nsecsElapsed();
我的系统每个大约需要0.005毫秒,所以不太相关。
我不确定是什么导致这种情况,因为它不是一个稳定的延迟。 我希望尽可能快地拥有一切,从而消除那些给我带来麻烦的额外时差。
如果我错过了显而易见的事,我会缺乏经验。
谢谢!
答案 0 :(得分:1)
与屏幕更新速度相比,更新速度没有任何意义。如果您需要与屏幕更新速率挂钩,则必须使用OpenGL或D3D实现UI,并在每次vsync后从芯片中获取新数据。
但我怀疑是否需要这些。会有很多价值观,而消费这种价值观的人无论如何都会以如此快的更新速度对他们做很多事情。请记住,人类需要大约200毫秒来处理文本/数值。如果你展示非文字/非数字显示,它会更好,但我怀疑它会在实践中有所作为。你没有设计游戏。
最有可能的是,您的UI与您正在连接的芯片之间的通信通道具有有限的带宽和/或不错的延迟,因此如果您在一个线程中有一个对象连续从芯片读取数据并发出新的值,以及消耗这些值的UI对象,它可以正常工作而无需定时器。您可以利用通信系统的属性,通过利用固有的延迟和带宽限制来确保正确的时序,从而获得时基。
回到你的问题本身:循环是一个C ++循环。它的性能与您在循环中所做的事情以及运行此代码的平台上的调度程序的性能有关。与Qt本身无关。