Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. C言語辞典
  3. time() / difftime() / clock()

time() / difftime() / clock()

現在時刻や経過時間を取得するための関数・型です。『<time.h>』に定義されており、タイムスタンプの記録・処理時間の計測・日時の計算などに使われます。

構文
// 現在のカレンダー時刻を返します。
// 戻り値: 現在時刻を表す time_t 値(エポックからの秒数)。失敗時は (time_t)(-1)。
// t が NULL でなければ *t にも結果を格納します。
time_t time(time_t *t);

// 2つの time_t 値の差を秒単位で返します。
// 戻り値: time1 - time0 の差(double 型の秒数)。
double difftime(time_t time1, time_t time0);

// プログラムが使用したプロセッサ時間を返します。
// 戻り値: clock_t 値。CLOCKS_PER_SEC で割ると秒単位になります。
clock_t clock(void);
型・定数一覧
名前種別概要
time_tカレンダー時刻を表す算術型です。通常は 1970年1月1日 00:00:00 UTC(Unixエポック)からの秒数を保持します。
clock_tプロセッサ時間を表す算術型です。clock() の戻り値を CLOCKS_PER_SEC で割ると秒単位になります。
CLOCKS_PER_SEC定数clock() の戻り値を秒に変換するための定数です(通常は 1000000)。
time()関数現在のカレンダー時刻(エポックからの秒数)を返します。
difftime()関数2つの time_t の差を秒単位の double で返します。
clock()関数プログラム起動からのプロセッサ時間を返します。
サンプルコード
#include <stdio.h>
#include <time.h>

// 重い処理のシミュレーションです(実際には意味のある処理を書きます)。
static void heavy_work(void) {
    volatile long sum = 0;
    for (long i = 0; i < 50000000L; i++) {
        sum += i; // 最適化除去のため volatile を使います。
    }
}

int main(void) {
    // time() で現在のUNIXタイムスタンプを取得します。
    time_t now = time(NULL);
    printf("UNIXタイムスタンプ: %ld\n", (long)now); // 例: 1700000000

    // difftime で2つの時刻の差を求めます。
    time_t start_cal = time(NULL);
    heavy_work();
    time_t end_cal = time(NULL);
    double elapsed_sec = difftime(end_cal, start_cal);
    printf("wall clock 経過時間: %.0f 秒\n", elapsed_sec); // 数秒単位の経過時間

    // clock() でCPU処理時間を計測します(マルチスレッドや待機時間を除いた純粋なCPU時間)。
    clock_t cpu_start = clock();
    heavy_work();
    clock_t cpu_end = clock();
    double cpu_sec = (double)(cpu_end - cpu_start) / CLOCKS_PER_SEC;
    printf("CPU処理時間: %.4f 秒\n", cpu_sec); // ミリ秒精度で出力されます。

    return 0;
}
概要

『time()』が返す『time_t』はエポック(1970年1月1日 00:00:00 UTC)からの秒数です。2つの time_t の差を求めるとき、型の実装が環境によって異なるため、直接減算するより『difftime()』を使う方が移植性が高くなります。

『clock()』はウォールクロック(実際の経過時間)ではなく、プロセスが使用したCPU時間を返します。スリープ中や I/O 待ち時間は含まれません。そのため、ループ処理のパフォーマンス計測に向いています。

32ビット環境の time_t は 2038年1月19日にオーバーフローします(2038年問題)。64ビット環境では問題ありませんが、組み込みシステムなど32ビット環境向けのコードでは注意が必要です。

取得した time_t を人間が読める形式に変換するには『localtime() / gmtime()』や『strftime()』を使用してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。