gettimeofday よりも clock_gettime よりも boost.chrono.Clock

実行時間を図るとき、posix 系列なら gettimeofday で実行時間を測っていた。だいたいこんな感じ。

#include <cstdio>
#include <sys/time.h>
 
double second()
{
  struct timeval t;
  gettimeofday(&t, NULL);
  return t.tv_sec + t.tv_usec * 1e-6;
}
 
int main(int argc, char** argv)
{
  const double start = second();
 
  /* do something */
 
  const double stop = second();
  std::printf("generate time %f[sec]\n", stop - start);
}

最近知ったが、gettimeofday は deprecated らしい*1。clock_gettime を使うことが推奨されている。

Man page of CLOCK_GETRES

double second_high_resolution()
{
  timespec ts;
  clock_gettime(CLOCK_REALTIME, &ts);
  return ts.tv_sec + ts.tv_nsec * 1e-9;
}

gcc の場合 librt が必要なので -lrt フラグをつける。

一方 C++er は (std|boost) chrono を使った。

User's Guide - 1.50.0

#include <boost/chrono/chrono.hpp>

int main(int argc, chat** argv)
{
  using namespace boost::chrono;

  auto start = high_resolution_clock::now();

  /* do something */

  auto stop  = high_resolution_clock::now();

  // now 関数の返り値同士を引き算すると duration という型が返る
  // duration<double> にすることで秒単位の時間を得られる
  duration<double> sec = stop - start;
  std::printf("generate time %f[sec]\n", sec.count());
}

上の boost.chrono のドキュメントにある timer example そのまま。

std の実装は調べていないが、boost の実装を見た限り clock_gettime を使って Clock の now 関数を実装している。

high_resolution_clock は system_clock か steady_clock のどちらかで、steady_clock のほうが正確な時間を得られるようだ。


結論:boost.chrono で時間計測をする

*1:http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/gettimeofday.2.html