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
Смотрите также
|
(deprecated in C23)
(C11)
|
преобразует объект
time_t
в текстовое представление
(функция) |
|
возвращает текущее календарное время системы как время с начала эпохи
(функция) |
|
|
C++ documentation
для
clock
|
|