Как получить точность часов с высоким разрешением?
в C++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? */
<< " nanosn";
}
3 ответов
минимальная представимая продолжительность -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
, числитель и знаменатель дроби соответственно.
я поддержал ответ Р. Мартиньо Фернандеса, потому что я считаю, что он предлагает самый ясный, самый прямой ответ на вопрос. Однако я хотел добавить немного кода, который показал немного больше <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
).
далее, каждый clock имеет вложенный тип с именем duration
. Это chrono::duration
это будет иметь то же самое std::ratio
, а так же num
и den
как указано в ответе Р. Мартиньо Фернандеса. Один из этих duration
s, преобразовано в NS
даст нам сколько наносекунд в один такт в размере Clock
. И это значение можно извлечь из duration
С count()
функции-члена.
для меня эта программа выводит:
1 ns
1000 ns
An std::ratio
тип, представляющий тиковый период часов, в секундах.Определено в пространстве имен std::chrono
template<intmax_t Num, intmax_t Denom = 1 > class ratio;