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

в 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 как указано в ответе Р. Мартиньо Фернандеса. Один из этих durations, преобразовано в NS даст нам сколько наносекунд в один такт в размере Clock. И это значение можно извлечь из duration С count() функции-члена.

для меня эта программа выводит:

1 ns
1000 ns

An std::ratio тип, представляющий тиковый период часов, в секундах.Определено в пространстве имен std::chrono

template<intmax_t Num, intmax_t Denom = 1 > class ratio;