Как получить точность high_resolution_clock? - PullRequest
23 голосов
/ 05 декабря 2011

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? */
              << " nanos\n";
}

Ответы [ 3 ]

26 голосов
/ 05 декабря 2011

Минимальная представимая длительность составляет 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, числитель и знаменатель дроби соответственно.

20 голосов
/ 05 декабря 2011

Я проголосовал за ответ Р. Мартиньо Фернандеса, потому что я считаю, что он предлагает самый ясный, самый простой ответ на вопрос. Однако я хотел добавить немного кода, который показал бы немного больше <chrono> функциональности и который отвечал на эту часть вопроса ОП:

могу ли я как-то хотя бы подсчитать в наносекундах минимум представительная продолжительность времени между тиками?

И нецелесообразно помещать столько информации в комментарии. Но я иначе рассматриваю этот ответ как поддерживающий комментарий к ответу Р. Мартиньо Фернандеса.

Сначала код, а затем объяснение:

#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 с, преобразованный в NS, даст нам сколько наносекунд за один такт Clock. И это значение можно извлечь из duration с помощью функции-члена count().

Для меня эта программа распечатывает:

1 ns
1000 ns
2 голосов
/ 05 декабря 2011

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

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