Подтвердить что ты не робот

Как получить точность 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";
}
4b9b3361

Ответ 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;