LinuxのCプログラムで処理時間の計測をする場合にはいくつかの方法が考えられるけど、それぞれの違いがあまりよくわかってなかったので、どのような長所、短所があるか調べてみた。
大きく分けて、システム時刻を取得する方法とプロセスの消費CPU時間を取得する方法がある。
何を計測するのかによって、どちらを使うか決める必要があるだろう。
まずはANSI Cで決められている関数を使う方法。移植性は最も高い。
[time関数]
time関数は現在のシステム時刻を返す。
ただし、秒精度までしか求められない上に計測中にシステム時刻が変更された場合にはズレが生じてしまう。
例:
[clock関数]
こちらはプロセスが使用したCPU時間を返す。
戻り値をCLOCKS_PER_SECで割れば、秒数に変換することもできる。
※CLOCKS_PER_SECはプロセッサの実際のクロック数の精度ではなく、C89,C99では1000000であることが要求されている。
例:
ただし、time関数と違い、sleep等でCPU時間を消費しない待機はカウントされないため、注意しよう。
※time_tとclock_tはlongとして定義されている処理系が多いけど、必ずしもそうではないので注意しよう。
大きく分けて、システム時刻を取得する方法とプロセスの消費CPU時間を取得する方法がある。
何を計測するのかによって、どちらを使うか決める必要があるだろう。
まずはANSI Cで決められている関数を使う方法。移植性は最も高い。
[time関数]
#include <time.h> time_t time(time_t *t);
time関数は現在のシステム時刻を返す。
ただし、秒精度までしか求められない上に計測中にシステム時刻が変更された場合にはズレが生じてしまう。
例:
time_t start; time_t end; long elapsed; time(&start); // 計測したい処理... time(&end); elapsed = (long)difftime(end, start);移植性を考えれば、time_t型は直接引き算をするのではなく、difftimeを使ったほうがいいだろう。
[clock関数]
#include <time.h> clock_t clock(void);
こちらはプロセスが使用したCPU時間を返す。
戻り値をCLOCKS_PER_SECで割れば、秒数に変換することもできる。
※CLOCKS_PER_SECはプロセッサの実際のクロック数の精度ではなく、C89,C99では1000000であることが要求されている。
例:
clock_t start; clock_t end; long elapsed; long elapsedsec; start = clock(); // 計測したい処理... end = clock(); elapsed = (long)(end - start); elapsedsec = elapsed / CLOCKS_PER_SEC;
ただし、time関数と違い、sleep等でCPU時間を消費しない待機はカウントされないため、注意しよう。
※time_tとclock_tはlongとして定義されている処理系が多いけど、必ずしもそうではないので注意しよう。
0 件のコメント:
コメントを投稿