Как получить очень точное истекшее время

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

Я читаю о chrono.h но он использует системное время, и я предпочитаю использовать процессорное время.

Есть ли способ сделать это, и иметь такую ​​гранулярность (нано секунд)?

6

Решение

Достижимая точность часов — это одно из свойств различного оборудования / ОС, которое до сих пор проникает практически во все языки, и, если честно, оказавшись в одной ситуации, я считаю, что создаю себе собственную абстракцию, которая достаточно хороша в вашем случае часто единственный выбор.

При этом, я бы избежал STL для высокоточной синхронизации. Так как это библиотека стандарт без единой истинной реализации он должен создать абстракцию, которая подразумевает одно из:

  • использовать наименьший общий знаменатель
  • утечка информации об оборудовании / ОС в зависимости от платформы

Во втором случае вы по существу вернетесь к тому, с чего начали, если хотите вести себя одинаково. Если вы можете позволить себе возможную потерю точности или отклонения стандарт часы, то непременно используйте его. Часы жесткие и тонкие.

Если вы знаете свою целевую среду, вы можете выбрать подходящие часы по старому стилю (#ifdef PLATFORM_ID...), например clock_gettime(), QPC) и реализуйте наиболее точную абстракцию, какую только сможете получить. Конечно, вы ограничены тем же выбором, который должен сделать STL, но, сократив набор платформ, вы, как правило, можете улучшить требования lcd.

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

1

Другие решения

std::chrono есть high_resolution_clockПожалуйста, имейте в виду, что точность ограничена процессором.

Если вы хотите использовать каталог функций из libc, вы можете использовать gettimeofday но, как и прежде, нет никакой гарантии, что это будет с точностью до наносекунды. (это только микросекундная точность)

4

Хотя есть стандартная функция, которая должен вернуть время процессора (std::clockНа самом деле нет портативного способа сделать это.

В системах POSIX (которые пытается использовать Linux) тогда std::clock должен делать правильные вещи, хотя Только не ожидайте, что он будет работать одинаково на не POSIX платформах, если вы когда-нибудь захотите сделать ваше приложение переносимым.

Значения, возвращаемые std::clock являются также приближенный, а точность и разрешение зависят от системы.

1
По вопросам рекламы [email protected]