[C]LinuxでCプログラムの処理時間を計測する方法いくつか その2

2015年9月7日月曜日

C linux unix

今回はPOSIXで決められている関数を使う方法。

[times関数]
#include <sys/times.h>
clock_t times(struct tms *buf);

times関数は引数bufにプロセスが消費したクロック数を格納する。
tms構造体はユーザ時間やシステム時間、子プロセスが消費した時間をフィールドとして持っている。

1秒あたりのクロック数は以下で求められる。
sysconf(_SC_CLK_TCK);

例:
    struct tms start;
    struct tms end;
    long elapsed;

    times(&start);
    // 計測したい処理...
    times(&end);

    elapsed = (long)(end.tms_utime - start.tms_utime);

[gettimeofday関数]
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);

times関数がクロック数を取得するものであるのに対して、こちらはシステム時刻を取得する関数となる。
また、timeval構造体はマイクロ秒まで保持することができる。

例:
    struct timeval start;
    struct timeval end;
    struct timeval elapsed;
    long elapsedusec;

    gettimeofday(&start, NULL);
    // 計測したい処理...
    gettimeofday(&end, NULL);

    timersub(&end, &start, &elapsed);
    elapsedusec = 1000 * 1000 * elapsed.tv_sec + elapsed.tv_usec;

gettimeofdayはシステム時刻を返すため、計測中にシステム時刻が変更された場合は影響を受けてしまう。 また、timeval構造体はtimersubマクロで差分を取得することができる。

しかしながら、現在のLinuxでは今回紹介した関数よりもclock_gettimeの使用が推奨されているようだ。
http://linuxjm.osdn.jp/html/LDP_man-pages/man2/times.2.html
http://linuxjm.osdn.jp/html/LDP_man-pages/man2/gettimeofday.2.html