私はプログラマーではなく、(opencv-) 関数に費やされた時間を評価しようとしています。1 MHz = 1 µs 分解能の周波数で外部信号 (関数発生器などから) をカウントできるカウンターを備えた AD コンバーターがあります。実際のカウンターの状態は、関数 cbIn32(..., unsigned long *pointertovalue) で照会できます。
したがって、私の考えは、対象の関数を呼び出す前後にカウンターのステータスを照会し、その差を計算することでした。しかし、その間に関数呼び出しを入れずに差を計算すると疑問が生じ、rel が明らかになりました。変動が大きい (80 ~ 400 µs 程度の値)。cbIn32() を呼び出すための平均時間 (約 180 µs) を計算し、これを目的の関数で費やされた推定時間から差し引くことが有効な解決策であるかどうか疑問に思いました。
だから私の最初の2つの質問:
- そのアプローチは一般的に実行可能ですか、それとも役に立たないですか?
- 変動はどこから来るのですか?
あるいは、getTickCount() を使用してみましたが、妥当な値が得られるようでした。しかし、フォーラムをチェックすると、解像度が約 10 ms と低く、不十分であることがわかりました (100 μs の解像度があればありがたいです)。ただし、得られた値はミリ秒未満の範囲でした。これにより、次の質問が発生します。
- 分解能が約 10 ミリ秒の場合、getTickCount() を使用した関数の評価時間は、どのようにしてマイクロ秒の範囲になるのでしょうか?
- 取得した値を信頼する必要がありますか?
私もgprofで試してみましたが、opencv関連の呼び出しを含む関数に費やされた時間は少なくとも数ミリ秒であると確信していますが、「蓄積された時間はありません」でした。ENABLE_PROFILING=ON で opencv を再構築しようとしましたが、結果は同じでした。プロファイリングを有効にするために静的なopencvライブラリを構築する必要があることをどこかで読みましたが、これで状況が改善されるかどうかはわかりません。ここでの質問は次のとおりです。
- gprof が opencv 関数も「見る」ようにするにはどうすればよいですか?
次の代替案は、WINAPI の QueryPerformanceCounter() 関数です。私はそれを使用する方法はありませんが、あなたがそれを推奨するなら、私は自分の道を戦い抜くでしょう. そのアプローチへの質問:
- 複数のコアがあるために問題になりますか?
- はいの場合、その問題を処理する「簡単な」方法はありますか?
私もverysleepyで試してみましたが、なぜか早くに終了します(他の.exeでは問題なく動作しました)。
初心者に優しい回答は非常に高く評価されます。私の目標は、最高の精度で最も簡単なアプローチを見つけることです。私はWin7 64ビット、MinGWを使用したEclipseに取り組んでいます。
お世話になりました...