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