c++ c++11 clock duration chrono

c++ 11 get timestamp



¿Cómo obtener la precisión de high_resolution_clock? (3)

La duración mínima representable es high_resolution_clock::period::num / high_resolution_clock::period::den second. Puedes imprimirlo así:

std::cout << (double) std::chrono::high_resolution_clock::period::num / std::chrono::high_resolution_clock::period::den;

¿Por qué es esto? El miembro del ::period un reloj se define como "El período de marca del reloj en segundos". Es una especialización de std::ratio que es una plantilla para representar ratios en tiempo de compilación. Proporciona dos constantes integrales: num y den , el numerador y el denominador de una fracción, respectivamente.

C ++ 11 define high_resolution_clock y tiene los tipos de miembros period y rep . Pero no puedo entender cómo puedo obtener la precisión de ese reloj.

O, si no puedo llegar a la precisión, ¿puedo al menos obtener un recuento en nanosegundos de la duración mínima del tiempo representable entre tic-pies? probablemente usando el 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"; }


Un tipo std::ratio representa el período de tictac del reloj, en segundos. Definido en el espacio de nombres std::chrono

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


Yo subestimé la respuesta de R. Martinho Fernandes porque creo que ofrece la respuesta más clara y directa a la pregunta. Sin embargo, quería agregar un pequeño código que mostrara un poco más de funcionalidad <chrono> y que abordara esta parte de la pregunta del OP:

¿De alguna manera puedo al menos obtener un recuento en nanosegundos de la duración mínima del tiempo representable entre tics?

Y no es práctico poner tanta información en un comentario. Pero de otra manera considero esta respuesta como un comentario de apoyo a la respuesta de R. Martinho Fernandes.

Primero el código, y luego la explicación:

#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>(); }

Primero creé un nanosecond que utiliza un double como representación ( NS ). Utilicé el double en caso de que tuviera que mostrar fracciones de un nanosegundo (por ejemplo, 0.5 ns ).

A continuación, cada reloj tiene un tipo anidado llamado duration . Este es un chrono::duration que tendrá la misma std::ratio , y por lo tanto el mismo num y den como se señala en la respuesta de R. Martinho Fernandes. Una de esas duration , convertida a NS , nos dará la cantidad de nanosegundos en un reloj de Clock . Y ese valor se puede extraer de la duration con la función de miembro count() .

Para mí este programa imprime:

1 ns 1000 ns