2016-12-12 17 views
1

私のプログラムでは、現在、チップのレジスタのライブアップデートを実現しようとしています。このライブアップデートは一定の間隔で行う必要がありますが、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それぞれかかります。

本当に安定した遅延ではないので、何が起こっているのかわかりません。 私はできるだけ早くすべてを持っていきたいので、余計な時差を解消してトラブルを起こしています。

明らかに私が見逃してしまった場合、私の未経験者には謝罪します。

ありがとうございます!

+0

例が完了していないと助けができません。例えば、 'reg'の型を知らなくても、' reg.size() 'が遅くなることはわかりません。 –

+0

また、コンパイルコマンドを共有することをお勧めします。だから、あなたがそれを忘れていなかったと仮定するのではなく、 '-O3'を使ったことが分かります... –

+0

ほとんどのデスクトップOSでは、信頼できるハードリアルタイムの動作を得られないことに注意してください。 10-20ミリ秒の「実行ギャップ」が一般的です(OSがあなた自身のタスクではなく他のタスクをしばらく実行したときに起こります)。また、コンピュータに負荷がかかっていると、ギ​​ャップがかなり長くなる可能性があります。リアルタイムの振る舞いが必要な場合(そして私はKubaの答えに同意しますが、それはあなたのようには聞こえません)、ハードリアルタイムのOSで実行する必要があります。 –

答えて

1

スクリーン更新レートよりも速く更新を行うことには意味がありません。画面更新レートに縛られる必要がある場合は、OpenGLまたはD3Dを使用してUIを実装し、各vsync後に新しいデータをチップから取得する必要があります。

しかし、私はそのいずれかの必要性について質問します。多くの価値があります。そして、これを消費する人間は、とにかく速い更新レートでそれらを多くすることはできません。人間はテキスト/数値を処理するのに約200msかかります。非テキスト/非数値ディスプレイを提示した方が良いですが、それが実際に何か変わることはないでしょう。あなたはゲームをデザインしていません。

あなたのUIと接続しているチップとの間の通信チャネルは、帯域幅や適切な待ち時間が限られているため、チップから連続的にデータを読み取り、新しい値、およびこれらを消費するUIオブジェクトを使用すると、タイマーを必要とせずに正常に動作します。固有の待ち時間と帯域幅の制限を利用してタイムベースを導き出すことで、通信システムのプロパティを使用して適切なタイミングを保証します。

質問自体に戻る:ループはC++のループです。そのパフォーマンスは、ループ内でやっていること、そしてこのコードを実行するプラットフォーム上のスケジューラーのパフォーマンスに結びついています。 Qt自体とは何の関係もありません。

関連する問題