時間情報の取り扱いについて書きなおしています。以下を参照ください。

時間の計測

作成:

プログラムの課題などで実行速度を向上するにはどうしたらよいか? なんて問題が出されることがあります。 そんな時実際どれくらい時間がかかっているのかを測ってみたくなります。 ベンチマークソフトのように処理速度の計測なんかをできたら面白いかもしれません。 そこで、時間の測り方を書いてみたいと思います。

まず、時間関係の関数を使うには time.h というヘッダファイルをインクルードする必要があります。 こいつの中身を一度見ておいたほうがいいでしょう。 Windows の Visual C++ だと C:\Program Files\Microsoft Visual Studio\VC98\Include にあります。 VineLinux の場合は /usr/include/ にありますが、 内部で /usr/include/bits/ にある time.h をインクルードしているので二つとも見なければいけません。

さて話は戻って、時間を取得する関数は time_t time(time_t *) と clock_t clock(NULL) があります。
time() は1秒単位の精度、 clock() の精度は機種に依存しますが大体 1ms 単位程度の精度があるようです。
time() の戻り値は time_t 型、 clock() の戻り値は clock_t 型です。これらの型は time.h の中で定義されています。 普通は long 型として定義されていますが、これらの型はそれぞれの時間を表しきれる精度を持った型という意味なので 移植性を高める意味でも、それぞれの型で戻り値を受け取るようにしたほうがいいでしょう。 (豆知識:型名で~_t とついているものは typedef を使って定義されているという意味です)

clock() の戻り値は、秒以下の単位まで整数型で表せるように適当な整数が掛けられています。 その適当な整数とは time.h の中で CLOCKS_PER_SEC という定数として定義されています。 ですから、 clock() で得られた値を CLOCKS_PER_SEC で割ると秒数が求まります。
この値は機種によって違うようで、 Windows の Visual C++ では 1000 と定義してありますが、 VineLinux の中では 1000000 と定義されています(UNIX 系はこれらしい)。 Windows は ms 単位、 UNIX は μs 単位ですが、計測できるのは100分の1秒までです。
これだけ大きな値がかかっていると表現できる時間が限られてしまいます。 long 型は一般に 32bit ですので大体36分弱までしか測れません。
UNIX では短時間に終わる処理の計測に clock() 長時間の処理のときは time() を使うようになるでしょう。
Windows の場合は25日弱までなら clock() で計測できそうです。

2002/12/01追記:最近気づいたんですが、 clock() で求まる時間と、time(time_t *) で求まる時間とは厳密には異なります。
clock() で求まる時間はそのプロセスが消費したプロセッサ時間になります。 一方、time(time_t *) で求まる時間は歴時間です。
つまり、clock() で求めた時間は実時間とは異なります。 (そのプロセスが実行されている間、プロセッサリソースのほぼ100%を占有している場合は、ほぼ実時間になります) time(time_t *) は精度は低いですがプロセスの切り替えに影響されず実時間を取得できます。

で、結局時間を測定するときは以下のようにします。

#include <time.h>
main(){
  ....

  clock_t start,end;
  start = clock();

  ..../*ここに測定したい処理を入れる。*/

  end = clock();
  printf("%.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
}

注:time() で時間を取得するときは(変数 t に入れるとする)

t=time(NULL);
time(&t);

の二通りの方法がある。