Я написал простую программу, чтобы определить, могу ли я получить наносекундную точность в моей системе, которая является VM RHEL 5.5 (ядро 2.6.18-194).
// cc -g -Wall ntime.c -o ntime -lrt
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
struct timespec spec;
printf("CLOCK_REALTIME - \"Systemwide realtime clock.\":\n");
clock_getres(CLOCK_REALTIME, &spec);
printf("\tprecision: %ldns\n", spec.tv_nsec);
clock_gettime(CLOCK_REALTIME, &spec);
printf("\tvalue : %010ld.%-ld\n", spec.tv_sec, spec.tv_nsec);
printf("CLOCK_MONOTONIC - \"Represents monotonic time. Cannot be set.\":\n");
clock_getres(CLOCK_MONOTONIC, &spec);
printf("\tprecision: %ldns\n", spec.tv_nsec);
clock_gettime(CLOCK_MONOTONIC, &spec);
printf("\tvalue : %010ld.%-ld\n", spec.tv_sec, spec.tv_nsec);
return 0;
}
Пример вывода:
CLOCK_REALTIME - "Systemwide realtime clock.":
precision: 999848ns
value : 1504781052.328111000
CLOCK_MONOTONIC - "Represents monotonic time. Cannot be set.":
precision: 999848ns
value : 0026159205.299686941
Итак, REALTIME
дает мне локальное время и MONOTONIC
время безотказной работы системы. Кажется, что оба таймера имеют точность μs (999848ns ≅ 1ms), хотя выходы MONOTONIC
в наносекундах, что запутывает.
man clock_gettime
:
CLOCK_REALTIME_HR Версия CLOCK_REALTIME с высоким разрешением.
Однако grep -R CLOCK_REALTIME_HR /usr/include/ | wc -l
возвращает 0
и пытается скомпилировать результаты в error: ‘CLOCK_REALTIME_HR’ undeclared (first use in this function)
.
Я пытался определить, могу ли я получить местное время в наносекундной точности, но либо у моего кода есть ошибка, либо, возможно, эта функция не полностью поддерживается в 5.5 (или VM HPET выключен или что-то еще).
Могу ли я получить местное время в наносекундах в этой системе? Что я делаю неправильно?
ИЗМЕНИТЬ
Ну, похоже, ответ №.
В то время как наносекундная точность может быть достигнута, система не гарантирует точность наносекунды в этом сценарии (здесь ясно ответ относительно разницы, а не разглагольствования). Типичное оборудование COTS на самом деле не справляется (другое ответ в правильном направлении).
Мне все еще интересно узнать, почему часы сообщают о том же clock_getres
разрешении еще MONOTONIC
дает то, что кажется наносекундными значениями, а REALTIME
дает микросекунды.