Namespaces
Variants

clock

From cppreference.net
Определено в заголовочном файле <time.h>
clock_t clock ( void ) ;

Возвращает приблизительное время процессора, использованное процессом с начала определенной реализации эры, связанной с выполнением программы. Чтобы преобразовать значение результата в секунды, разделите его на CLOCKS_PER_SEC .

Только разница между двумя значениями, возвращёнными разными вызовами clock , имеет смысл, так как начало эры clock не обязательно совпадает с запуском программы.

clock время может увеличиваться быстрее или медленнее, чем системное время, в зависимости от вычислительных ресурсов, предоставленных программе операционной системой. Например, если процессор используется другими процессами, clock время может увеличиваться медленнее, чем системное время. С другой стороны, если текущий процесс является многопоточным и доступно более одного вычислительного ядра, clock время может увеличиваться быстрее, чем системное время.

Содержание

Возвращаемое значение

Время процессора, использованное программой на данный момент.

  • Если процессорное время недоступно, возвращает ( clock_t ) ( - 1 ) .
  • Если значение использованного процессорного времени не может быть представлено типом clock_t , возвращает неопределённое значение.

Примечания

В POSIX-совместимых системах, clock_gettime с идентификатором часов 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 (стр: 285)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.27.2.1 Функция clock (стр. 389)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.23.2.1 Функция clock (стр: 339)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.12.2.1 Функция clock

Смотрите также

(deprecated in C23) (C11)
преобразует объект time_t в текстовое представление
(функция)
возвращает текущее календарное время системы как время с начала эпохи
(функция)
C++ documentation для clock