Help us understand the problem. What is going on with this article?

c++11の機能を使ってStopWatchクラスを作ってみる

More than 1 year has passed since last update.

tl;dr

c++11からは時間計測のための関数も標準化されている。ただ使い方が複雑なので備忘録も兼ねて、処理をラップしたStopWatchクラスを作って掲載しておく。

#include <chrono>

struct StopWatch
{
  StopWatch() { pre_ = std::chrono::high_resolution_clock::now(); }

 //前回のlap関数コールからの経過時間をmilli sec単位で返す
  double lap()
  {
    auto tmp = std::chrono::high_resolution_clock::now();  // 計測終了時刻を保存
    auto dur = tmp - pre_;
    pre_ = tmp;
    return std::chrono::duration_cast<std::chrono::nanoseconds>(dur).count()/1000000.0;
  }
  std::chrono::high_resolution_clock::time_point pre_;
};

int main()
{
  using namespace std;
  int abc = 0;

//使い方
  StopWatch sw;
  //何か処理1
  cout << "duration1:" << sw.lap()  << endl;
  //何か処理2
  cout << "duration2:" << sw.lap()  << endl;

//より厳密に計測するなら
  sw.lap();
  //何か処理3
  auto dur = sw.lap();
  cout << "duration3:" << dur  << endl;

解説

今回は、nanosecまで精度を出せるようにしてdouble型で1.0が1msになるように変換している。また、時間の取得にはstd::chrono::high_resolution_clock::now()を使ったけど、Visual Studio 2017の場合、 std::chrono::high_resolution_clockは、std::chrono::steady_clockのエイリアスで、
std::chrono::steady_clockは、_Query_perf_frequencyと_Query_perf_counterを使っている。
ちなみに、精度は落ちるが、std::chrono::high_resolution_clock::now()の代わりに、std::chrono::system_clock::now()を使ってもよい。厳密に計測するならサンプルコードのように、標準出力のコードの前にlap()関数の結果をストアしてそれを表示するにしたほうが、出力処理を含まないより正確な計測結果を得られる。

補足

OpenCVを使うなら、cv::TickMeterもある。

luftfararen
理論から実践まで両方やる画処理屋。 簡潔かつ高速実行を旨とし日々コーディング中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away