経過時間計測

あかん。高精度時間計測のやり方を何度やっても忘れてしまう。

以前こんなメモを残したのに、コード例を掲載するのを忘れたために、即活用するという点ではまるで役に立たなかった。

今度こそ。俺は保存するぞ・・・保存をよぉ・・・


【活用機会】
ミリ秒からマイクロ秒精度までの時間計測を行いたい。
(NSDateのミリ秒では精度がちょっと不安な場合、など)


【ヘッダファイル】
まずは、sys/time.h を include するのだ。
話はそれからだ。


【変数型】
UIのあるアプリで時間を計測したいのであれば、時間の記録は、あるクラスの属性に持たせることになるだろう。
このとき、struct timeval型変数を使う。

struct timeval start_time;


【現在時刻を取得する】
gettimeofday関数を使う。第一引数に出力用のtimeval構造体アドレスを渡す。
第二引数はタイムゾーンだが、通常は使用せずにNULLを指定する。*1

gettimeofday(&start_time, NULL);


【経過時間を計測する】
2つのtimeval構造体変数の差分を比較すれば、経過時間を計測することができる。

timeval構造体には以下のように2つのメンバ変数が存在する。

struct timeval {
    time_t      tv_sec;     /* 秒 */
    suseconds_t tv_usec;    /* マイクロ秒 */
};

たとえば、start_timeから現在までの経過時間を秒単位で調べるには以下のようにすればよい。

// 何かのイベント時に開始時刻を記録
gettimeofday(&start_time, NULL);

// ...

// また別の何かのイベント時に経過時間を判定する
struct timeval now;
gettimeofday(&now, NULL);

double sec = (double)(now.tv_sec - start_time.tv_sec);
double micro = (double)(now.tv_usec - start_time.tv_usec);
double passed = sec + micro / 1000.0 / 1000.0;

// passedが経過時間を秒で表している

// 0.3秒以上経過したらほにゃらら
if (0.3 <= passed)
{
    // ほにゃらら
}


【エラーチェック】
gettimeofday関数が失敗した場合、戻り値で-1が返却される。



よし、今度はちゃんとメモした。

これで忘れても大丈夫。