作成 2013.12.14
更新 2014.02.05
GCC で精度の高い時間間隔を取得する
CentOS 6 で clock() が常に 0 になって困ったのでメモ
#include <time.h>
int clock_gettime(clockid_t clk_id, struct timespec *tp);
を使用する。
timespec の構造体は以下の通り定義されている。
struct timespec {
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};
サンプル コード
計測したい処理を、usleep のところと差し替える。
mytimespan.c
#include <stdio.h>
#include <time.h>
#include <unistd.h>

int main(){
  struct timespec res,tp1,tp2;
  long sec,nsec;

  // 時刻精度の確認
  if(clock_getres(CLOCK_REALTIME,&res) < 0){
    perror("clock_getres");
    return 1;
  }
  printf("Time Precision:\t%ld.%09ld\n", (long)res.tv_sec, res.tv_nsec);

  if(clock_gettime(CLOCK_REALTIME,&tp1) < 0){
    perror("clock_gettime begin");
    return 2;
  }

  // 処理時間を計測したいコードをここに記述
  // 開始
  usleep(100000);
  // 終了

  if(clock_gettime(CLOCK_REALTIME,&tp2) < 0){
    perror("clock_gettime end");
    return 3;
  }
  sec = tp2.tv_sec - tp1.tv_sec;
  nsec = tp2.tv_nsec - tp1.tv_nsec;
  if(nsec < 0){
    sec--;
    nsec += 1000000000L;
  }
  printf("Time Span:\t%ld.%09ld\n",sec,nsec);
  return 0;
}
コンパイル
キモは -lrt を付加すること。glibc 2.17 より前はこれが無いとコンパイルできない。(CentOS6 は glibc-2.12 が標準)
$ gcc -O2 -Wall -g -o mytimespan -lrt mytimespan.c
実行結果
Time Precision は clock_gettime で得られる時刻精度を示している。環境依存なので常にこの値になるとは限らない。
$ ./mytimespan
Time Precision: 0.000000001
Time Span:      0.100170659
タグ: C言語 Linux

©2004-2017 UPKEN IPv4