湯LOG

主に自分用のメモ

各種ライブラリにおける処理時間計測方法(C++)

はじめに

画像処理やら点群処理などでいくつかのライブラリを使ったりしているのですが、処理時間を計測したいときに毎回やり方を忘れてしまうためメモ。

C++標準

C++で処理時間等を計測する際、clock()やtimeGetTime()、 GetTickCount()等があるが、clock()は精度が10msec程度(処理系依存)なため使い勝手があまり良くなく、GetTickCountは精度は良いもののwinmm.lib(windows系)で用意されている関数のためxcode等で使えないといった問題がある。
一方で、std::choronoはプラットフォームに依存せず、精度も1msecと良い。

std::chrono::system_clock::time_point  start, end;
start = std::chrono::system_clock::now();
// 計測したい処理
end = std::chrono::system_clock::now();
double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();

std::chrono::duration_cast<変換型>(duration)の変換型には,ナノ秒(nanoseconds),マイクロ秒(microseconds),ミリ秒(microseconds),秒(seconds) を指定できる。

boost

"boost/timer.hpp"にあるboost::timerを使います。これはCの標準ライブラリのclock()を使って簡単に時間計測をしてくれる便利なクラスで、基本的な使い方は以下のようになります。

boost::timer t;

// 計測したい処理

std::cout << t.elapsed() << " sec" << std::endl;

t.restart()を使うと、0からリスタートします。
ちなみにdouble型なのでおそらくミリ秒単位でもいける?

また、CPUタイマーというのを使うとプログラム全体のCPU時間などを勝手に出力してくれます。

boost::timer::auto_cpu_timer t;

// 計測したい処理
// 特に出力しなくてOK

Qt

QElapsedTimerを使います。

QElapsedTimer et;
et.start();

// 計測したい処理

qint64 t = et.elapsed();
ui->label->setText( QString::number(t) ); // ラベルに表示

処理にかかる時間をミリ秒単位で出力できます。

OpenCV

定番なのは、cv::getTickCount()を使ったもので、以下のような記述になります。

int64 start = cv::getTickCount();

// 計測したい処理

int64 end = cv::getTickCount();
double elapsedMsec = (end - start) * 1000 / cv::getTickFrequency();
std::cout << elapsedMsec << "ms" << std::endl;


また、cv::TickMeterを使った計測も可能です。
恐らくこっちのほうが直観的でわかりやすいかと。

cv::TickMeter meter;
meter.start();

// 計測したい処理

meter.stop();
std::cout << meter.getTimeMilli() << "ms" << std::endl;

秒、ミリ秒、マイクロ秒が取れます。

PCL

"pcl/console/time.h"に記述されているpcl::console::TicTocを使います。

pcl::console::TicToc tt;
tt.tic();

// 計測したい処理

pcl::console::print_value("%g", tt.toc()); pcl::console::print_info(" ms");

pcl::consoleはカラーで出力してくれるから見やすい。

ITK

"itkTimeProbe.h"にあるitk::TimeProbeを使います。

itk::TimeProbe tp;
tp.Start();

// 計測したい処理

tp.stop();
std::cout << "Mean: " << tp.GetMean() << std::endl;
std::cout << "Total: " << tp.GetTotal() << std::endl;

Reset()やGetStandardDeviation ()などもうまく使えたら便利だと思います。