El siguiente fragmento de código:
struct timespec ts;
for (int x = 0; x < 100000000; x++) {
timespec_get(&ts, TIME_UTC);
long cTime = (long) time(NULL);
if (cTime != ts.tv_sec && ts.tv_nsec < 3000000) {
printf("cTime: %ld\n", cTime);
printf("ts.tv_sec: %ld\n", ts.tv_sec);
printf("ts.tv_nsec: %ld\n", ts.tv_nsec);
}
}
produce esta salida:
...
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2527419
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2534036
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2540359
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2547039
...
¿Por qué la discrepancia entre cTime
y ts.tv_sec
? Tenga en cuenta que el problema no se produce si el condicional se cambia a ts.tv_nsec >= 3000000
. El problema se basa en que los nanosegundos son más pequeños que 3000000.
timespec_get()
? ¿Es esto C o C ++? Aspecto del productostd::timespec_get
. Por favor use la etiqueta apropiada.man
entradatimespec_get
en mi sistema, así que saqué conclusiones. Tiene sentido.Respuestas:
La razón es que usted (implícitamente) usa diferentes relojes del sistema.
timespec_get()
usa el reloj de tiempo real de todo el sistema de alta resolución , mientrastime()
usa el reloj de tiempo real gruesoTratar de usar
en lugar de tu
timespec_get()
, entonces la diferencia debería desaparecer.Editar:
Esto se puede ver en Linux Kernel Source, vclock_gettime.c
De hecho, el tema es un poco sutil para ver aquí. La parte de segundos de los miembros de la estructura utilizada
CLOCK_REALTIME_COARSE
y queCLOCK_REALTIME
contiene valores idénticos, pero la parte de nanosegundos es diferente; conCLOCK_REALTIME
ella puede ser mayor que1000000000
(que es un segundo). En este caso, se arregla en la llamada:Esta corrección no se realiza
CLOCK_REALTIME_COARSE
ni contime()
. Esto explica la diferencia entreCLOCK_REALTIME
ytime()
.fuente
time
ser implementado con el reloj (presumiblemente) más eficiente pero menos preciso (en la teoría de que de todos modos solo tiene una segunda granularidad, entonces, ¿quién necesita precisión)? Retrasar el tiempo real en un milisegundo más o menos (las pruebas en línea mostraron un retraso ocasional de más de un ms, pero no mucho más) cuando solo se solicita una segunda granularidad, no es tan importante, supongo.