clock

来自cppreference.com
< c‎ | chrono
定义于头文件 <time.h>
clock_t clock(void);

返回进程从关联到程序执行的,实现定义时期的起点开始,所用的处理器时间。需将其除以CLOCKS_PER_SEC,若欲转换此值到秒。

只有两次对clock相异调用的返回值的差是有意义的,因为clock时期的起始不必与程序起始一致。clock时间或许会快于或慢于挂钟时间,这取决于操作系统给予程序的执行资源。例如,若CPU为其他进程所共享,clock时间可能慢于挂钟。另一方面,若当前进程为多线程,而有更多资源可用,clock时间可能会快于挂钟。

目录

[编辑] 参数

(无)

[编辑] 返回值

程序迄今为止所用的处理器时间。若该信息不可用,则为(clock_t)(-1)

[编辑] 注意

在兼容POSIX的系统上,clock_gettime与时钟ID CLOCK_PROCESS_CPUTIME_ID会表现得更好。

clock()的返回值会因一些实现回卷。譬如在拥有32位clock_t的机器上,它会在2147秒或者说36分后回卷。

[编辑] 示例

此示例展现clock()和现实时间之差异。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <threads.h> // POSIX中的pthread.h
 
// 函数f()做一些耗时的工作
int f(void* thr_data) // POSIX中返回void*
{
    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();
 
    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);
 
    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

[编辑] 参阅

struct time_t对象转换成文本展示
(函数) [edit]
返回纪元开始经过的当前系统日历时间
(函数) [edit]
clockC++文档