Следующий фрагмент кода:
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);
}
}
производит этот вывод:
...
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
...
Почему расхождение между cTime
и ts.tv_sec
? Обратите внимание, что проблема не возникает, если условие изменяется на ts.tv_nsec >= 3000000
. Проблема заключается в том, что наносекунды меньше 3000000.
timespec_get()
? Это C или C ++? Похожеstd::timespec_get
. Пожалуйста, используйте соответствующий тег.man
записи дляtimespec_get
в моей системе, поэтому я сделал поспешные выводы. Имеет смысл.Ответы:
Причина в том, что вы (неявно) используете разные системные часы.
timespec_get()
использует высокое разрешение общесистемного часы реального времени, в то время какtime()
ИСПОЛЬЗУЕТ грубые часы реального времени.Попробуй использовать
вместо вашего
timespec_get()
, тогда разница должна исчезнуть.Редактировать:
Это можно увидеть в Исходнике ядра Linux, vclock_gettime.c
На самом деле эту проблему немного уловить. Секундная часть элементов структуры, используемых
CLOCK_REALTIME_COARSE
иCLOCK_REALTIME
содержащих идентичные значения, но наносекундная часть отличается; сCLOCK_REALTIME
ним может быть больше, чем1000000000
(что составляет одну секунду). В этом случае это фиксируется на вызове:Эта коррекция не выполняется ни с помощью
CLOCK_REALTIME_COARSE
, ни сtime()
. Это объясняет разницу междуCLOCK_REALTIME
иtime()
.источник
time
реализации с (предположительно) более производительными, но менее точными часами (по теории, что в любом случае он имеет только вторую гранулярность, так кому нужна точность)? Отставание в реальном времени на миллисекунду или около того (онлайн-тестирование показало случайную задержку более чем на мс, но не намного больше), когда вы запрашиваете только вторую степень детализации, это не так важно, как мне кажется.