時間の計測を行う

C言語において時間の計測を行う方法は複数ありそれぞれの特徴を把握して最適なものを選択しなければならない.

time
time関数を用いる場合は秒単位の精度でしか測定されない.
またプロセスの実時間の測定を行う.

#include
#include

int main(){
time_t t1,t2;
t1 = time(NULL);

/* 処理の記述 */

t2 = time(NULL);
printf("time = %d[s]\n", (int)(t2-t1));
return 0;
}

clock
clock関数をの場合にはtimeよりも精度良く計測が出来る.
具体的な精度についてはシステム依存でLinuxでは1/100秒単位で計測が可能.
またtimeのように実時間ではなく,プロセスの占有時間のみが計測されることに注意しなければならない.

#include
#include

int main(){
clock_t c1,c2;
c1 = clock();

/* 処理の記述 */

c2 = clock();
printf("time = %d[s]\n", (double)(c2-c1)/CLOCKS_PER_SEC);
return 0;
}

timeとclockの違い
計測対象を空のループとsleep関数としてtime関数とclock関数のそれぞれで計測する以下のようなソースを考える.

#include
#include
int main()
{
clock_t c1,c2;
time_t t1,t2;
int i;
c1 = clock();
t1 = time(NULL);

for(i=0; i<100000000; i++);
sleep(2);

c2 = clock();
t2 = time(NULL);

printf("ttime = %f\n", (double)(t2-t1));
printf("ctime = %f\n", (double)(c2-c1)/CLOCKS_PER_SEC);
return 0;
}
timeコマンドで実行した結果は以下のようになった.

ttime = 2.000000
ctime = 0.290000

real 0m2.283s
user 0m0.290s
sys 0m0.000s

この結果から

  1. time関数の場合は秒精度であること(2.283の小数点以下が切り捨てられている
  2. clock関数はプロセスの占有時間しか計測しないこと(sleep中の計測を行っていない)

ことが確認できる.

gettimeofday
gettineofday関数を用いればマイクロ秒の精度まで計測が可能となる.
gettineofday関数はtime関数同様に実時間計測を行う.

#include
#include
int main(){
struct timeval s, e;
gettimeofday(&s, NULL);

/* 処理の記述 */

gettimeofday(&e, NULL);
printf("time = %lf\n", (e.tv_sec - s.tv_sec) + (e.tv_usec - s.tv_usec)*1.0E-6);
return 0;
}


getrusage
getrusage関数を用いればgettimeofday関数と同じようにマイクロ秒の精度で,プロセス占有時間とシステム時間の2つを得ることができる.

#include
#include
#include
int main(){
struct rusage usage;
struct timeval ut1, ut2;
struct timeval st1, st2;

getrusage(RUSAGE_SELF, &usage );
ut1 = usage.ru_utime;
st1 = usage.ru_stime;

/* 処理の記述 */

getrusage(RUSAGE_SELF, &usage );
ut2 = usage.ru_utime;
st2 = usage.ru_stime;

printf("user time = %lf\n", (ut2.tv_sec - ut1.tv_sec) + (ut2.tv_usec - ut1.tv_usec)*1.0E-6);
printf("sys time = %lf\n", (st2.tv_sec - st1.tv_sec) + (st2.tv_usec - st1.tv_usec)*1.0E-6);
}