clock
Определён в заголовочном файле <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
См. также
|
(устарело в C23)(C11) | преобразует объект time_t в текстовое представление (функция) |
| возвращает текущее календарное время системы в виде времени, прошедшего с начала эпохи (функция) |
|
Документация C++ для clock |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/chrono/clock