在我的程序中,我目前正在尝试实现芯片寄存器的实时更新。此实时更新必须以一定的间隔进行,60 if和120 if是常见的,但如果可能的话,200 if会更好。
无论如何,我想优化我的循环,因为速度是至关重要的。为了查看慢的部分在哪里,我使用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毫秒。举个例子,“内部”通常测量大约5毫秒,而外部通常测量大约10毫秒。有时差异较小(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.005ms,所以并不是真正相关。
我不确定是什么导致了这种情况,因为这并不是真正的稳定延迟。我希望所有的事情都能尽快完成,这样就能消除那些给我带来麻烦的额外时差。
如果我错过了显而易见的事情,我为我的缺乏经验道歉。
谢谢!
发布于 2016-12-13 02:35:49
比屏幕更新速度更快的更新是没有意义的。如果您需要绑定到屏幕更新率,则必须使用OpenGL或D3D实现您的UI,并在每次虚拟同步后从芯片获取新数据。
但我质疑其中任何一项的必要性。将会有大量的值,而使用这些值的人无论如何都不能以如此快的更新速度对它们做很多事情。请记住,人类处理文本/数值大约需要200ms。如果你呈现一个非文本/非数字的显示,那会更好,但我怀疑它在实践中会有什么不同。你不是在设计游戏。
最有可能的是,您的UI和您所连接的芯片之间的通信通道具有有限的带宽和/或适当的延迟,因此,如果您在一个线程中有一个对象不断地从芯片读取数据并发出新值,并且UI对象使用这些值,那么它将在不需要计时器的情况下正常工作。您将使用通信系统的属性,通过利用固有的延迟和带宽限制来获得一个时基,从而确保适当的计时。
回到你的问题本身:这个循环是一个C++循环。它的性能与您在循环中执行的操作以及运行此代码的平台上的调度器的性能有关。与Qt本身无关。
https://stackoverflow.com/questions/41104873
复制相似问题