clock
From cppreference.com
| ヘッダー <time.h> で定義 |
||
| clock_t clock(void); |
||
プログラムの実行に関連する、実装定義のエラ(era)の開始以降に使用されたおおよそのプロセッサ時間を返します。戻り値を秒に変換するには、CLOCKS_PER_SEC で割ります。
clock のエラの開始はプログラムの開始と一致する必要はないため、異なる clock の呼び出し間の差分のみが意味を持ちます。
clock 時間は、オペレーティングシステムによってプログラムに与えられた実行リソースに応じて、壁時計(wall clock)よりも速く進んだり遅く進んだりすることがあります。たとえば、CPU が他のプロセスと共有されている場合、clock 時間は壁時計よりも遅く進むことがあります。一方、現在のプロセスがマルチスレッドであり、複数の実行コアが利用可能な場合、clock 時間は壁時計よりも速く進むことがあります。
目次 |
[編集] 戻り値
これまでにプログラムによって使用されたプロセッサ時間。
[編集] 注
POSIX 互換システムでは、クロック ID CLOCK_PROCESS_CPUTIME_ID を持つ clock_gettime は、より高い解像度を提供します。
clock() によって返される値は、実装によってはラップアラウンド(wrap around)することがあります。たとえば、そのような実装で 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 The clock function (p: 285)
- C11標準 (ISO/IEC 9899:2011)
- 7.27.2.1 The clock function (p: 389)
- C99標準 (ISO/IEC 9899:1999)
- 7.23.2.1 The clock function (p: 339)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.12.2.1 The clock function
[編集] 関連項目
| (C23で非推奨)(C11) |
time_t オブジェクトをテキスト表現に変換する (関数) |
| エポックからの時間としてシステムの現在のカレンダー時間を返す (関数) | |
| C++ ドキュメント for clock
| |