LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-04-22

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もある。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0