OpenCVで時間の計測
cv::TickMeter を使いましょう。なんか影の薄いcontribにあります。
cv::TickMeter meter; meter.start(); // 何かの処理 meter.stop(); std::cout << meter.getTimeMilli() << "ms" << std::endl;
定番は以下のような書き方ですが、卒業しましょう。OpenCVのを使わずQueryPerformanceCounter, timeGetTime等の別の手段を使うにしろ、大抵これと似たようになると思います。TickMeterにより、これよりも見通し良く、何をしているか直感的にわかるコードにできます。
int64 start = cv::getTickCount(); // 何かの処理 int64 end = cv::getTickCount(); double elapsedMsec = (end - start) * 1000 / cv::getTickFrequency(); std::cout << elapsedMsec << "ms" << std::endl;
なお、std::ostreamへの出力のオペレータが定義されているので、直接TickMeterオブジェクトを投げることもできます。"12.345sec" のような形式で、秒数が表示されます。
std::cout << meter << std::endl;
複数回計測
resetしてstartです。
cv::TickMeter meter; // 1回目 meter.start(); for(int i=0; i<100000; i++) cv::Mat m(1, 1, CV_8UC1); meter.stop(); std::cout << meter << std::endl; // 2回目 meter.reset(); meter.start(); for(int i=0; i<100000; i++) cv::Mat m = cv::Mat::eye(10, 10, CV_32FC1); meter.stop(); std::cout << meter << std::endl;
.NET FrameworkのSystem.Diagnostics.Stopwatch.Restartメソッド相当のものがあれば満点ですね。
TickMeter の定義
秒、ミリ秒、マイクロ秒が取れます。充分ですね。
namespace cv { class CV_EXPORTS TickMeter { public: TickMeter(); void start(); void stop(); int64 getTimeTicks() const; double getTimeMicro() const; double getTimeMilli() const; double getTimeSec() const; int64 getCounter() const; void reset(); private: int64 counter; int64 sumTime; int64 startTime; }; }