Entre las funciones de temporización, time, clock getrusage, clock_gettime, gettimeofdayy 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 . gettimeofdayDevuelve el valor del reloj de pared, clock_gettimedevuelve el valor del reloj de pared o proceso o valores hilos en función del Clockparámetro pasado a ella. getrusageyclock 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 getrusageusa 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 getimeofdayfunció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_gettimela 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.timeygettimeofdaydevuelven, 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_getEjemplo 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.cy lo reenvía directamente a:clock_gettimeyCLOCK_REALTIMEson POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html , yman clock_gettimedice 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_clockes un alias parasystem_clocksystem_clockreenvía a la primera de las siguientes opciones disponibles:clock_gettime(CLOCK_REALTIME, ...)gettimeofdaytimesteady_clockreenvía a la primera de las siguientes opciones disponibles:clock_gettime(CLOCK_MONOTONIC, ...)system_clockPreguntado por: ¿ Diferencia entre std :: system_clock y std :: steady_clock?
CLOCK_REALTIMEvsCLOCK_MONOTONIC: Diferencia entre CLOCK_REALTIME y CLOCK_MONOTONIC?fuente