Namespaces
Variants

clock

From cppreference.net
ヘッダーで定義 <time.h>
clock_t clock ( void ) ;

プログラムの実行に関連する実装定義の時代からのプロセスによって使用されたおおよそのプロセッサ時間を返します。結果の値を秒に変換するには、それを CLOCKS_PER_SEC で除算してください。

clock の異なる呼び出しによって返される2つの値の差のみが意味を持ちます。なぜなら、 clock の紀元の始まりはプログラムの開始と一致する必要がないためです。

clock 時間は、オペレーティングシステムによってプログラムに与えられる実行リソースに応じて、実時間よりも速くまたは遅く進む可能性があります。例えば、CPUが他のプロセスと共有されている場合、 clock 時間は実時間よりも遅く進むことがあります。一方、現在のプロセスがマルチスレッド化されており、複数の実行コアが利用可能な場合、 clock 時間は実時間よりも速く進む可能性があります。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、リンク先は一切変更していません - C++関連の用語(Return value, Notes, Example, References, See also)は原文のまま保持しています - 番号や書式は完全に維持しています - プロフェッショナルな技術文書としての正確性を保っています

戻り値

これまでのプログラムで使用されたプロセッサ時間。

  • プロセッサ使用時間が利用できない場合、 ( clock_t ) ( - 1 ) を返す。
  • プロセッサ使用時間の値が clock_t で表現できない場合、未規定の値を返す。

注記

POSIX互換システムでは、 clock_gettime 関数とクロックID CLOCK_PROCESS_CPUTIME_ID を使用することで、より高精度な計測が可能です。

clock() が返す値は、一部の実装ではラップアラウンドする可能性があります。例えば、そのような実装では、 clock_t が符号付き32ビット整数で、 CLOCKS_PER_SEC 1000000 の場合、約2147秒(約36分)後にラップアラウンドします。

この例は、 clock() 時間と実時間の違いを示しています。

#ifndef __STDC_NO_THREADS__
    #include <threads.h>
#else
    // POSIX alternative
    #define _POSIX_C_SOURCE 199309L
    #include <pthread.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// the function f() does some time-consuming work
int f(void* thr_data) // return void* in POSIX
{
    (void) thr_data;
    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();
#ifndef __STDC_NO_THREADS__
    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);
#endif
    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

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.27.2.1 clock関数 (p: 285)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.27.2.1 clock関数 (p: 389)
  • C99標準 (ISO/IEC 9899:1999):
  • 7.23.2.1 clock関数 (p: 339)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.12.2.1 clock関数

関連項目

(C23で非推奨) (C11)
time_t オブジェクトをテキスト表現に変換する
(関数)
エポックからの経過時間としてシステムの現在のカレンダー時間を返す
(関数)