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 を使うことが推奨されている。
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 を使った。
#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