名前空間
変種
操作

clock

提供: cppreference.com
< c‎ | chrono
ヘッダ <time.h> で定義
clock_t clock(void);

プログラムの実行に相対的な処理系定義の開始点からのプロセスが使用した概算プロセッサ時間を返します。 結果の値を秒に変換するには CLOCKS_PER_SEC で割ってください。

clock の開始点がプログラムの開始と一致する必要はないため、異なる clock の呼び出しによって返された2つの値の間の差のみが意味を持ちます。 clock の時間は、オペレーティングシステムによってプログラムに与えられた実行リソースによって、壁時計より早く進む可能性も遅く進む可能性もあります。 例えば、 CPU が他のプロセスと共有されている場合、 clock は壁時計より遅く進む可能性があります。 一方、現在のプロセスがマルチスレッド化されていて、2個以上の実行コアが利用可能な場合、 clock 時間は壁時計より早く進む可能性があります。

目次

[編集] 引数

(なし)

[編集] 戻り値

プログラムによってそれまでに使用されたプロセッサ時間、または情報が利用できないかその値が表現できない場合は (clock_t)(-1)

[編集] ノート

POSIX 互換のシステムでは、 clock_id に CLOCK_PROCESS_CPUTIME_ID を指定した clock_gettime がより良い分解能を提供します。

一部の非準拠な処理系では clock() の戻り値はラップアラウンドすることがあります。 例えば、そのような処理系では、 clock_t が32ビット整数で CLOCKS_PER_SEC が 1000000 であれば、約2147秒 (約36分) で一周するでしょう。

[編集]

この例は clock() 時間と実時間の違いをデモンストレーションします。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <threads.h> // pthread.h in POSIX
 
// the function f() does some time-consuming work
int f(void* thr_data) // return void* in POSIX
{
    volatile double d = 0;
    for (int n=0; n<10000; ++n)
       for (int m=0; m<10000; ++m)
           d += d*n*m;
    return 0;
}
 
int main(void)
{
    struct timespec ts1, tw1; // both C11 and POSIX
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts1); // POSIX
    clock_gettime(CLOCK_MONOTONIC, &tw1); // POSIX; use timespec_get in C11
    clock_t t1 = clock();
 
    thrd_t thr1, thr2;  // C11; use pthread_t in POSIX
    thrd_create(&thr1, f, NULL); // C11; use pthread_create in POSIX
    thrd_create(&thr2, f, NULL);
    thrd_join(thr1, NULL); // C11; use pthread_join in POSIX
    thrd_join(thr2, NULL);
 
    struct timespec ts2, tw2;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts2);
    clock_gettime(CLOCK_MONOTONIC, &tw2);
    clock_t t2 = clock();
 
    double dur = 1000.0*(t2-t1)/CLOCKS_PER_SEC;
    double posix_dur = 1000.0*ts2.tv_sec + 1e-6*ts2.tv_nsec
                       - (1000.0*ts1.tv_sec + 1e-6*ts1.tv_nsec);
    double posix_wall = 1000.0*tw2.tv_sec + 1e-6*tw2.tv_nsec
                       - (1000.0*tw1.tv_sec + 1e-6*tw1.tv_nsec);
 
    printf("CPU time used (per clock(): %.2f ms\n", dur);
    printf("CPU time used (per clock_gettime()): %.2f ms\n", posix_dur);
    printf("Wall time passed: %.2f ms\n", posix_wall);
}

出力例:

CPU time used (per clock(): 1580.00 ms
CPU time used (per clock_gettime()): 1582.76 ms
Wall time passed: 792.13 ms

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.27.2.1 The clock function (p: 389)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.23.2.1 The clock function (p: 339)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.12.2.1 The clock function

[編集] 関連項目

time_t オブジェクトをテキスト表現に変換します
(関数) [edit]
エポックからの経過時間で表したシステムの現在時刻を返します
(関数) [edit]