私のプログラムでは、現在、チップのレジスタのライブアップデートを実現しようとしています。このライブアップデートは一定の間隔で行う必要がありますが、60hzと120hzが一般的ですが、可能であれば200hzがさらに良いでしょう。Qt C++タイミングの問題
とにかく、速度が重要なので私のループを最適化したいと思います。遅い部分がどこにあるかを見るために、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.005msそれぞれかかります。
本当に安定した遅延ではないので、何が起こっているのかわかりません。 私はできるだけ早くすべてを持っていきたいので、余計な時差を解消してトラブルを起こしています。
明らかに私が見逃してしまった場合、私の未経験者には謝罪します。
ありがとうございます!
例が完了していないと助けができません。例えば、 'reg'の型を知らなくても、' reg.size() 'が遅くなることはわかりません。 –
また、コンパイルコマンドを共有することをお勧めします。だから、あなたがそれを忘れていなかったと仮定するのではなく、 '-O3'を使ったことが分かります... –
ほとんどのデスクトップOSでは、信頼できるハードリアルタイムの動作を得られないことに注意してください。 10-20ミリ秒の「実行ギャップ」が一般的です(OSがあなた自身のタスクではなく他のタスクをしばらく実行したときに起こります)。また、コンピュータに負荷がかかっていると、ギャップがかなり長くなる可能性があります。リアルタイムの振る舞いが必要な場合(そして私はKubaの答えに同意しますが、それはあなたのようには聞こえません)、ハードリアルタイムのOSで実行する必要があります。 –