スポンサーリンク

| キーワード:

timespec_getでナノ秒単位で時間計測する

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]
    };

timespec_get

1) ts の指す timespec オブジェクトにタイムベース base における現在のカレンダー時刻を格納します。
2) timespec_get の引数 base として使用するのに適した値に展開されます。

https://ja.cppreference.com/w/c/chrono/timespec_get

基本的な使い方

timespec tspec;
timespec_get(&tspec, TIME_UTC);

printf(" %lld.%ld\n", tspec.tv_sec, tspec.tv_nsec);

実行例:
1562584816.201974300

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

碧色工房
https://www.mm2d.net/main/prog/c/time-03.html

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: