close
Пространства имён
Варианты
Действия

clock

Материал из cppreference.com
< c | chrono
<tbody> </tbody>
Определено в заголовочном файле <time.h>
clock_t clock(void);

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

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

Параметры

(отсутствуют)

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

Процессорное время, используемое программой до текущего момента или (clock_t)(-1) если эта информация не доступна или значение не может быть представлено.

Замечания

В POSIX-совместимых системах, clock_gettime с идентификатором часов CLOCK_PROCESS_CPUTIME_ID предлагает лучшую точность.

Значение, возвращаемое clock(), может повторяться в некоторых несоответствующих стандарту реализациях. Например, если в такой реализации clock_t это знаковое 32-битное целое и CLOCKS_PER_SEC это 1000000, оно повторится примерно через 2147 секунд (около 36 минут).

Пример

Этот пример демонстрирует различие между временем в clock() и реальным временем.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <threads.h> // pthread.h в POSIX

// функция f() выполняет некоторую трудоёмкую работу
int f(void* thr_data) // возвращает void* в POSIX
{
    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; используйте timespec_get в C11
    clock_t t1 = clock();

    thrd_t thr1, thr2;  // C11; используйте pthread_t в POSIX
    thrd_create(&thr1, f, NULL); // C11; используйте pthread_create в POSIX
    thrd_create(&thr2, f, NULL);
    thrd_join(thr1, NULL); // C11; используйте pthread_join в POSIX
    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

Ссылки

  • Стандарт 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

См. также

(устарело в C23)(C11)
преобразует объект time_t в текстовое представление
(функция) [править]
возвращает текущее календарное время системы как время, прошедшее с начала эпохи Unix
(функция) [править]