search
LoginSignup
0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

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

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
What you can do with signing up
0
Help us understand the problem. What are the problem?