C++11以上、Visual C++15 以降(?)での時間計測。
#include <time.h>
time.h内でstruct timespecが定義されている。
struct timespec { time_t tv_sec; // Seconds - >= 0 long tv_nsec; // Nanoseconds - [0, 999999999] };
1)
https://ja.cppreference.com/w/c/chrono/timespec_getts
の指す timespec オブジェクトにタイムベースbase
における現在のカレンダー時刻を格納します。
2)timespec_get
の引数base
として使用するのに適した値に展開されます。
timespec tspec; timespec_get(&tspec, TIME_UTC); printf(" %lld.%ld\n", tspec.tv_sec, tspec.tv_nsec);
timespec_get関数で、tv_secに秒、tv_nsecにナノ秒の値が、それぞれtime_t型とlong型で入る。
time_t型は環境にもよるがVC++2019,x64では__int64なのでprintfではlldを使用している。
要はtimespec_get関数である時点から数えた現在時刻の秒を整数部分と小数部分(ナノ秒を表す整数値)を分けて取得できる。
開始時刻、終了時刻を記録して引き算をすればいいのだが、整数部分と小数部分が分かれているためそのまま引き算できない。例えば、
開始・・・10.5秒
終了・・・11.2秒
だった場合、
整数部・・・11-10
小数部・・・2-5
となり、 10.5秒~11.2秒までの間は 1.-3
となってしまう。要は繰り下がりも考慮しなければならない。
//Sleepに必要 #include <Windows.h> //printf等 #include <cstdio> //std::int64_tに必要 #include <cstdint> //time.hでも可 #include <ctime> int main() { struct timespec f,t; // from ~ to timespec_get(&f, TIME_UTC);// 計測開始時刻 Sleep(3000); //処理 timespec_get(&t, TIME_UTC);// 計測終了時刻 ////////////////////////////////// // to - from の計算
long nsec; std::int64_t tsec;
if (f.tv_nsec < t.tv_nsec) { nsec = t.tv_nsec - f.tv_nsec; tsec = t.tv_sec - f.tv_sec; } else {//繰り下がり必要 nsec = 1000000000 + t.tv_nsec - f.tv_nsec; tsec = t.tv_sec - f.tv_sec - 1; } ///////////////////////////////// // 表示 printf("経過時間:%lld.%ld\n", tsec, nsec); getchar(); }
cppreference.com
https://ja.cppreference.com/w/c/chrono/timespec_get