clock
来自cppreference.com
| 在标头 <time.h> 定义
|
||
| |
||
返回从关联到进程开始执行的实现定义时期的起,进程所用的粗略处理器时间。将此值除以 CLOCKS_PER_SEC 可转换为秒。
只有两次对 clock 不同调用的返回值的差才有意义,因为 clock 时期的起始不必与程序起始一致。
clock 时间或许会快于或慢于挂钟时间,这取决于操作系统给予程序的执行资源。例如,如果 CPU 为其他进程所共享,那么 clock 时间就可能会慢于挂钟。另一方面,如果当前进程为多线程,而有更多资源可用,那么 clock 时间就可能会快于挂钟。
返回值
程序迄今为止所用的处理器时间。
- 如果处理器时间不可用,那么就会返回
(clock_t)(-1)。 - 如果处理器时间的值无法以 clock_t 表示,那么就会返回一个未指定的值。
注解
在兼容 POSIX 的系统上,带时钟 id CLOCK_PROCESS_CPUTIME_ID 的 clock_gettime 提供更高的解析度。
clock() 返回的值会在一些实现上回卷。例如在某种实现上,如果 clock_t 是有符号 32 位整数而 CLOCKS_PER_SEC 是 1000000,那么它将在约 2147 秒(约 36 分)后回卷。
示例
此示例演示 clock() 和现实时间的差异。
运行此代码
#ifndef __STDC_NO_THREADS__
#include <threads.h>
#else
// POSIX 替代方案
#define _POSIX_C_SOURCE 199309L
#include <pthread.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 函数 f() 做一些耗时的工作
int f(void* thr_data) // POSIX 中返回 void*
{
(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; // C11 与 POSIX 皆可
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts1); // POSIX
clock_gettime(CLOCK_MONOTONIC, &tw1); // POSIX ;C11 中用 timespec_get
clock_t t1 = clock();
#ifndef __STDC_NO_THREADS__
thrd_t thr1, thr2; // C11 ;POSIX 中用 pthread_t
thrd_create(&thr1, f, NULL); // C11 ; POSIX 中用 pthread_create
thrd_create(&thr2, f, NULL);
thrd_join(thr1, NULL); // C11 ; POSIX 中用 pthread_join
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 (第 285 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.27.2.1 The clock function (第 389 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.23.2.1 The clock function (第 339 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.12.2.1 The clock function
参阅
(C23 弃用)(C11) |
将 struct time_t 对象转换成文本表示 (函数) |
| 返回纪元开始经过的当前系统日历时间 (函数) | |
clock 的 C++ 文档
| |