Как получить точность high_resolution_clock?
С++ 11 определяет high_resolution_clock
и имеет типы членов period
и rep
. Но я не могу понять, как я могу получить точность этих часов.
Или, если мне не удастся достичь точности, могу ли я как-то хотя бы получить счет в наносекундах минимальной представляемой продолжительности времени между тиками? возможно, используя period
?
#include <iostream>
#include <chrono>
void printPrec() {
std::chrono::high_resolution_clock::rep x = 1;
// this is not the correct way to initialize 'period':
//high_resolution_clock::period y = 1;
std::cout << "The smallest period is "
<< /* what to do with 'x' or 'y' here? */
<< " nanos\n";
}
Ответы
Ответ 1
Минимальная отображаемая длительность high_resolution_clock::period::num / high_resolution_clock::period::den
секунд. Вы можете распечатать его следующим образом:
std::cout << (double) std::chrono::high_resolution_clock::period::num
/ std::chrono::high_resolution_clock::period::den;
Почему это? Член часов ::period
определяется как "Период тика часов в секундах". Это специализация std::ratio
, которая является шаблоном для представления коэффициентов во время компиляции. Он обеспечивает две интегральные константы: num
и den
, числитель и знаменатель дроби, соответственно.
Ответ 2
Я поддержал Р. Мартинхо Фернандес, потому что я считаю, что он предлагает самый ясный, самый простой ответ на вопрос. Однако я хотел добавить небольшой код, который показал немного больше функциональности <chrono>
и обратился к этой части вопроса OP:
Могу ли я как-то хотя бы получить счет в наносекундах минимального представляемая продолжительность времени между тиками?
И нецелесообразно помещать эту информацию в комментарий. Но я иначе отношусь к этому ответу в качестве вспомогательного комментария к ответу Р. Мартиньо Фернандесу.
Сначала введите код, а затем объяснение:
#include <iostream>
#include <chrono>
template <class Clock>
void
display_precision()
{
typedef std::chrono::duration<double, std::nano> NS;
NS ns = typename Clock::duration(1);
std::cout << ns.count() << " ns\n";
}
int main()
{
display_precision<std::chrono::high_resolution_clock>();
display_precision<std::chrono::system_clock>();
}
Сначала я создал nanosecond
, который использует double
как представление (NS
). Я использовал double
на всякий случай, чтобы показать доли наносекунды (например, 0.5 ns
).
Затем все часы имеют вложенный тип с именем duration
. Это chrono::duration
, у которого будет тот же std::ratio
, и, таким образом, те же num
и den
, как указано в ответе Р. Мартиньо Фернандеса. Один из этих duration
s, преобразованный в NS
, даст нам, сколько наносекунд за один такт тика Clock
. И это значение может быть извлечено из duration
с помощью функции-члена count()
.
Для меня эта программа печатает:
1 ns
1000 ns
Ответ 3
Тип std::ratio
, представляющий период тика часов, в секундах. Определенный в пространстве имен std::chrono
template<intmax_t Num, intmax_t Denom = 1 > class ratio;