Среди временных функций, time
, clock
getrusage
, clock_gettime
, gettimeofday
и timespec_get
я хочу , чтобы четко понять , как они реализуются , и каковы их возвращаемые значения для того , чтобы знать , в какой ситуации я должен использовать их.
Сначала нам нужно классифицировать функции, возвращающие значения настенных часов, по сравнению с функциями, возвращающими значения процессов или потоков . gettimeofday
возвращает значение настенных часов, clock_gettime
возвращает значение настенных часов или значения процесса или потоков в зависимости от Clock
переданного ему параметра. getrusage
и clock
вернуть значения процесса.
Тогда второй вопрос касается реализации этих функций и, как следствие, их точности. Какой аппаратный или программный механизм использует эти функции.
Кажется, что getrusage
используется только тик ядра (обычно 1 мс) и, как следствие, не может быть более точным, чем мс. Это правильно? Тогда getimeofday
функция, кажется, использует самое точное из доступных аппаратных средств. Как следствие, его точность обычно составляет микросекунду (не может быть больше из-за API) на новейшем оборудовании. Как насчет clock
man-страницы, которая говорит о «приближении», что это значит? Как насчет clock_gettime
API в наносекунде, значит ли это, что он может быть настолько точным, если базовое оборудование это позволяет? Как насчет монотонности?
Есть ли другие функции?
источник
clock_gettime
, поэтому использованиеgettimeofday()
немного более универсальным, чемclock_gettime()
times()
(с буквой s), которая существует в POSIX с момента выпуска 1. Относительно GNU / Linux: Согласно man-странице clock (3),clock()
из glibc 2.17 и более ранних версий был реализован поверх него, но для улучшения точность, теперь она реализована поверхclock_gettime(CLOCK_PROCESS_CPUTIME_ID,...)
, что также указано в POSIX, но не является обязательным.time
иgettimeofday
возвращают, по крайней мере, в настоящее время, секунды с начала эпохи (или unix-timestamps). Это не зависит от часовых поясов / летнего времени. Еще одна историяC11
timespec_get
Пример использования по адресу: https://stackoverflow.com/a/36095407/895245
Максимально возможная возвращаемая точность составляет наносекунды, но фактическая точность определяется реализацией и может быть меньше.
Он возвращает время стены, а не использование процессора.
glibc 2.21 реализует его
sysdeps/posix/timespec_get.c
и передает прямо:clock_gettime
иCLOCK_REALTIME
POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html , иman clock_gettime
говорит, что эта мера может иметь разрывы, если вы измените некоторые настройки системного времени во время работы вашей программы.С ++ 11 хроно
Так как мы на этом, давайте рассмотрим их также: http://en.cppreference.com/w/cpp/chrono
GCC 5.3.0 (C ++ stdlib находится внутри источника GCC):
high_resolution_clock
это псевдоним дляsystem_clock
system_clock
переходит к первому из следующих доступных:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
переходит к первому из следующих доступных:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
На вопрос: Разница между std :: system_clock и std :: stable_clock?
CLOCK_REALTIME
vsCLOCK_MONOTONIC
: разница между CLOCK_REALTIME и CLOCK_MONOTONIC?источник