Время измерения в Linux - время против часов, против вызов getrusage против часовой методов gettime против gettimeofday против timespec сделать?



среди функций времени, time,clockgetrusage,clock_gettime,gettimeofday и timespec_get, Я хочу четко понять, как они реализуются и каковы их возвращаемые значения, чтобы знать, в какой ситуации я должен их использовать.



Сначала нам нужно классифицировать функции, возвращающие значения настенных часов сравнить с возвращением функций значения процессов или потоков. gettimeofday возвращает значение настенных часов,clock_gettime возвращает значение настенных часов или значения процесса или потоков в зависимости от Clock переданный ему параметр. getrusage и clock возвращаемые значения процесса.



тогда второй вопрос касается реализации этих функций и, как следствие, их точность. Какой аппаратный или программный механизм используют эти функции.



кажется,getrusage использует только клеща ядра (обычно 1 мс) и, как следствие, не может быть более точным, чем МС. Правильно ли это?
Затем элемент getimeofday функция, по-видимому, использует наиболее точное базовое оборудование. Как следствие, его точность обычно составляет микросекунду (не может быть больше из-за API) на недавнем оборудовании.
А как же clock, man-страница говорит о "приближении", что это значит?
А как же clock_gettime, API находится в наносекунде, означает ли это, что он может быть настолько точным, если базовое оборудование позволяет это? А как насчет монотонности?



есть ли другие функции?

830   2  

2 ответов:

проблема в том, что существует несколько различных функций времени, доступных в C и C++, и некоторые из них различаются по поведению между реализациями. Есть также много полу-ответов, плавающих вокруг. Составление списка функций часов вместе с их свойствами даст правильный ответ на этот вопрос. Для начала давайте спросим, какие соответствующие свойства мы ищем. Глядя на ваш пост, я предлагаю:

  • какое время измеряется часами? (реальный, пользователь, система или, Надеюсь, нет, настенные часы?)
  • какова точность часов? (с, МС, МКС или быстрее?)
  • после того, как сколько времени часы обернуть вокруг? Или есть какой-то механизм, чтобы избежать этого?
  • является ли часы монотонными, или они будут меняться с изменениями в системном времени (через NTP, часовой пояс, летнее время, пользователем и т. д.)?
  • как это зависит от реализации?
  • конкретный функции устаревших, нестандартных и т. д.?

прежде чем начать список, я хотел бы отметить, что время настенных часов редко является правильным временем для использования, тогда как оно меняется с изменением часового пояса, изменением летнего времени или синхронизацией настенных часов NTP. Ни одна из этих вещей не хороша, если вы используете время для планирования событий или для оценки производительности. Это действительно хорошо только для того, что говорит название, часы на стене (или рабочий стол).

здесь что я нашел до сих пор для часов в Linux и OS X:

  • time() возвращает время настенных часов из ОС с точностью до секунд.
  • clock() кажется, возвращает сумму пользовательского и системного времени. Он присутствует в C89 и позже. В свое время это должно было быть процессорное время в циклах, но современные стандарты как POSIX требуется, чтобы CLOCKS_PER_SEC был 1000000, что дает максимально возможную точность 1 мкс. Точность в моей системе действительно составляет 1 мкс. Эти часы обертываются, как только они заканчиваются (это обычно происходит после ~2^32 тиков, что не очень долго для часов 1 МГц). man clock говорит, что с glibc 2.18 он реализован с clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...) в Linux.
  • clock_gettime(CLOCK_MONOTONIC, ...) обеспечивает разрешение наносекунды, монотонно. Я считаю, что "секунды" и "наносекунды" хранятся отдельно, каждый в 32-битных счетчиках. Таким образом, любое обертывание произойдет после многих десятков лет время безотказной работы. Это выглядит как очень хорошие часы, но, к сожалению, он еще не доступен на OS X. POSIX 7 описание CLOCK_MONOTONIC в качестве дополнительного расширения.
  • getrusage() оказались лучшим выбором для моей ситуации. Он сообщает о времени пользователя и системы отдельно и не оборачивается. Точность в моей системе составляет 1 МКС, но я также тестировал ее на системе Linux (Red Hat 4.1.2-48 с GCC 4.1.2), и там точность была только 1 ms.
  • gettimeofday() возвращает время настенных часов с (номинально) точностью МКС. В моей системе эти часы, похоже, имеют точность µs, но это не гарантировано, потому что "разрешение системных часов зависит от аппаратного обеспечения". POSIX.1-2008 говорит, что. "Приложения должны использовать clock_gettime() функция вместо устаревшего gettimeofday() функция", так что вы должны держаться подальше от него. Linux x86 и реализует его как система звоните.
  • mach_absolute_time() это опция для синхронизации с очень высоким разрешением (ns) на OS X. В моей системе это действительно дает разрешение ns. В принципе, эти часы обертываются, однако они хранят ns, используя 64-разрядное целое число без знака, поэтому обертывание не должно быть проблемой на практике. Переносимость сомнительна.
  • я написал гибридную функцию на основе этот фрагмент который использует clock_gettime при компиляции на Linux или таймер Mach при компиляции на OS X, чтобы получить точность ns как на Linux, так и на OS X.

все вышеперечисленное существует как в Linux, так и в OS X, за исключением случаев, когда указано иное. "Моя система" в приведенном выше-это Apple, работающая под управлением OS X 10.8.3 с GCC 4.7.2 от MacPorts.

наконец, вот список ссылок, которые я нашел полезными в дополнение к одной выше:


обновление: для OS X,clock_gettime был реализован по состоянию на 10.12 (Сьерра). Кроме того, обе платформы на основе POSIX и BSD (например, OS X) разделяют rusage.ru_utime полевые структуры.

C11 timespec_get

пример использования по адресу:https://stackoverflow.com/a/36095407/895245

максимально возможная возвращаемая точность составляет наносекунды, но фактическая точность определяется реализацией и может быть меньше.

он возвращает время стены, а не использование процессора.

в glibc 2.21 реализует под sysdeps/posix/timespec_get.c и он переходит непосредственно к:

clock_gettime (CLOCK_REALTIME, ts) < 0)

clock_gettime и CLOCK_REALTIME are POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html, и man clock_gettime говорит, что эта мера может иметь разрывы, если вы измените некоторые настройки системного времени во время выполнения программы.

C++11 chrono

так как мы на нем, давайте рассмотрим их также: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:: steady_clock?

CLOCK_REALTIME vs CLOCK_MONOTONIC:разница между CLOCK_REALTIME и CLOCK_MONOTONIC?

Comments

    Ничего не найдено.