es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener exactamente el mismo resultado de timeval con C++11 chrono.

En mi proyecto de C++, hay una función muy antigua que utilizaba la función del sistema de Linux para realizar algunos cálculos sobre el tiempo. Aquí está una parte del código:

struct timeval tv;
gettimeofday(&tv, NULL);
uint32_t seqId = (tv.tv_sec % 86400)*10000 + tv.tv_usec / 100;

* 10000 y / 100 no están mal, porque este código se trata de generar un seqId.

Ahora intento sustituirlo utilizando std::chrono de C++11. Aquí está mi código:

std::chrono::high_resolution_clock::duration duration_since_midnight() {
    auto now = std::chrono::high_resolution_clock::now();
    std::time_t tnow = std::chrono::high_resolution_clock::to_time_t(now);
    tm *date = std::localtime(&tnow);
    date->tm_hour = 0;
    date->tm_min = 0;
    date->tm_sec = 0;
    auto midnight = std::chrono::system_clock::from_time_t(std::mktime(date));
    return now - midnight;
}
auto res = duration_since_midnight();
auto sec = std::chrono::duration_cast<std::chrono::seconds>(res);
auto mil = std::chrono::duration_cast<std::chrono::milliseconds>(res - sec);
std::cout << sec.count() * 10000 + mil.count() << std::endl;

Sin embargo, el resultado siempre es un poco erróneo. Por ejemplo, la antigua versión me podría dar 360681491, pero mi versión me da 360680149. Se puede ver que no son exactamente iguales.

No sé por qué. ¿O es que no es posible hacerlo con std::chrono?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es posible hacer esto con std::chrono. El problema probablemente se debe a la precisión de los cálculos. La función gettimeofday devuelve el tiempo en microsegundos, mientras que las funciones de std :: chrono devuelven el tiempo en nanosegundos. Para obtener el mismo resultado, deberá ajustar los cálculos en consecuencia. Por ejemplo, puede usar std::chrono::microseconds en lugar de std::chrono::milliseconds al convertir el resultado.

Comments are closed.