私は現在、画像処理アプリケーションに取り組んでいます。アプリケーションは Web カメラから画像をキャプチャし、その上で何らかの処理を行います。アプリはリアルタイムで応答する必要があります (各リクエストを処理するのに 50 ミリ秒未満が理想的です)。私は持っているコードでいくつかのタイミング テストを行っており、非常に興味深いものを見つけました (以下を参照)。
clearLog();
log("Log cleared");
camera.QueryFrame();
camera.QueryFrame();
log("Camera buffer cleared");
Sensor s = t.val;
log("Sx: " + S.X + " Sy: " + S.Y);
Image<Bgr, Byte> cameraImage = camera.QueryFrame();
log("Camera output acuired for processing");
log
が呼び出されるたびに、処理を開始してからの時間が表示されます。これが私のログ出力です:
[3 ms]Log cleared
[41 ms]Camera buffer cleared
[41 ms]Sx: 589 Sy: 414
[112 ms]Camera output acuired for processing
StopWatch
タイミングはfromを使用して計算されSystem.Diagonostics
ます。上記の時間は累積です。したがって、ログのクリアには 3ms かかりました。また、「カメラ バッファのクリア」には (41-3 = 38ms) かかりました。
質問1
同じメソッドが 2 回呼び出されると約 40 ミリ秒で実行され、次に 1 回呼び出されると実行に時間がかかる (約 70 ミリ秒) ため、これは少し興味深いと思います。
値を代入するのにそれほど時間がかかることはありませんよね?
質問2
また、上記の各ステップのタイミングは、その時々によって異なります。一部のステップの値は、0 ミリ秒ほど低い場合もあれば、100 ミリ秒ほど高い場合もあります。ほとんどの数値は比較的一貫しているように見えますが。
これは、CPUがその間に他のプロセスによって使用されたためではないでしょうか? (これが他の理由である場合は、私に知らせてください)
この関数が実行されたときに確実に最高の優先度を取得する方法はありますか? 速度テストの結果が一貫して(時間的に)低くなるようにします。
編集
上記の 2 つの空白クエリ フレームを削除するようにコードを変更したため、コードは次のようになりました。
clearLog();
log("Log cleared");
Sensor s = t.val;
log("Sx: " + S.X + " Sy: " + S.Y);
Image<Bgr, Byte> cameraImage = camera.QueryFrame();
log("Camera output acuired for processing");
タイミング結果は次のとおりです。
[2 ms]Log cleared
[3 ms]Sx: 589 Sy: 414
[5 ms]Camera output acuired for processing
次のステップにかかる時間が長くなりました (次のステップが以前はほぼ瞬時に行われていたのに対し、次のステップが 20 ~ 30 ミリ秒後にジャンプする場合があります)。これはCPUのスケジューリングによるものだと思います。このコードを実行している間、CPU が他のことをするようにスケジュールされないようにする方法はありますか?