Entre las funciones de temporización, time
, clock
getrusage
, clock_gettime
, gettimeofday
y timespec_get
, quiero entender con claridad cómo se aplican y cuáles son sus valores de retorno con el fin de conocer la situación en la que tengo que usarlos.
Primero debemos clasificar las funciones que devuelven valores de reloj de pared en comparación con las funciones que devuelven valores de proceso o subprocesos . gettimeofday
Devuelve el valor del reloj de pared, clock_gettime
devuelve el valor del reloj de pared o proceso o valores hilos en función del Clock
parámetro pasado a ella. getrusage
yclock
devolver valores del proceso.
Luego, la segunda pregunta se refiere a la implementación de estas funciones y, como consecuencia, su precisión. Qué mecanismo de hardware o software utiliza estas funciones.
Parece que getrusage
usa solo la marca del núcleo (generalmente 1 ms de largo) y, como consecuencia, no puede ser más precisa que el ms. ¿Es correcto? Entonces, la getimeofday
función parece utilizar el hardware subyacente más preciso disponible. Como consecuencia, su precisión suele ser el microsegundo (no puede ser más debido a la API) en hardware reciente. ¿Qué pasa clock
, la página del manual habla de "aproximación", qué significa? ¿Qué pasa si clock_gettime
la API está en nanosegundos, significa que puede ser tan precisa si el hardware subyacente lo permite? ¿Qué pasa con la monotonicidad?
¿Hay alguna otra función?
fuente
clock_gettime
, de ahí el uso degettimeofday()
ser un poco más versátil queclock_gettime()
times()
(con una s), que ha existido en POSIX desde el Número 1. Con respecto a GNU / Linux: De acuerdo con la páginaclock()
del comando man clock (3), desde glibc 2.17 y anteriores se implementó encima, pero para mejorar precisión, ahora se implementa además declock_gettime(CLOCK_PROCESS_CPUTIME_ID,...)
, que también se especifica en POSIX pero es opcional.time
ygettimeofday
devuelven, al menos hoy en día, segundos desde época (también conocido como unix-timestamps). Esto es independiente de las zonas horarias / DST. Los segundos bisiestos son otra historia ...C11
timespec_get
Ejemplo de uso en: https://stackoverflow.com/a/36095407/895245
La precisión máxima posible devuelta es nanosegundos, pero la precisión real está definida por la implementación y podría ser menor.
Devuelve el tiempo de la pared, no el uso de la CPU.
glibc 2.21 lo implementa debajo
sysdeps/posix/timespec_get.c
y lo reenvía directamente a:clock_gettime
yCLOCK_REALTIME
son POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html , yman clock_gettime
dice que esta medida puede tener discontinuidades si cambia alguna configuración de la hora del sistema mientras se ejecuta el programa.C ++ 11 crono
Ya que estamos en eso, vamos a cubrirlos también: http://en.cppreference.com/w/cpp/chrono
GCC 5.3.0 (C ++ stdlib está dentro de la fuente de GCC):
high_resolution_clock
es un alias parasystem_clock
system_clock
reenvía a la primera de las siguientes opciones disponibles:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
reenvía a la primera de las siguientes opciones disponibles:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Preguntado por: ¿ Diferencia entre std :: system_clock y std :: steady_clock?
CLOCK_REALTIME
vsCLOCK_MONOTONIC
: Diferencia entre CLOCK_REALTIME y CLOCK_MONOTONIC?fuente