Como conseguir tempo em milissegundos em C++

Jinku Hu 12 outubro 2023
  1. Utilize o std::chrono::system_clock::now() Método para obter tempo em milissegundos em C++
  2. Utilize a função gettimeofday() para obter tempo em milissegundos em C++
  3. Utilize a função time() para obter tempo em milissegundos em C++
Como conseguir tempo em milissegundos em C++

Este artigo apresentará múltiplos métodos C++ sobre como obter tempo em milissegundos.

Utilize o std::chrono::system_clock::now() Método para obter tempo em milissegundos em C++

A classe std::chrono::system_clock é a interface em C++ para obter um relógio de parede em tempo real em todo o sistema. A maioria dos sistemas utiliza o tempo Unix, que é representado como segundos passados de 00:00:00 UTC em 1 de janeiro de 1970, chamado de época Unix. Note que os segundos bissextos são ignorados. Assim, o tempo Unix não é realmente uma representação exata do UTC.

Em primeiro lugar, o método now() é chamado para retornar o ponto atual no tempo. O próximo método chamado é time_since_epoch para recuperar a quantidade de tempo entre *this e a época do relógio, mas ele retorna um objeto de classe std::chrono::duration. Este objeto deve chamar o método count para retornar o número real de ticks, e representá-lo como milissegundos. O resultado é obtido utilizando duration_cast<milliseconds>.

#include <sys/time.h>

#include <chrono>
#include <ctime>
#include <iostream>

using std::cout;
using std::endl;
using std::chrono::duration_cast;
using std::chrono::milliseconds;
using std::chrono::seconds;
using std::chrono::system_clock;

int main() {
  auto millisec_since_epoch =
      duration_cast<milliseconds>(system_clock::now().time_since_epoch())
          .count();
  auto sec_since_epoch =
      duration_cast<seconds>(system_clock::now().time_since_epoch()).count();

  cout << "seconds since epoch: " << sec_since_epoch << endl;
  cout << "milliseconds since epoch: " << millisec_since_epoch << endl;

  return EXIT_SUCCESS;
}

Resultado:

seconds since epoch: 1603612778
milliseconds since epoch: 1603612778389

Utilize a função gettimeofday() para obter tempo em milissegundos em C++

O gettimeofday é a função compatível com o POSIX para recuperar o relógio do sistema. É necessário um endereço do objeto struct timeval como o primeiro argumento para armazenar valores de tempo. Os valores são tv_sec representando o número de segundos e tv_usec como microssegundos passados desde a época do Unix. O gettimeofday retorna o valor int 0 para o sucesso e -1 para a falha em fornecer facilidades de tratamento de erros. O segundo argumento da função é struct timezone, mas como foi depreciado, você deveria apenas passar um nullptr. Note que seria necessário incluir <sys/time.h> cabeçalho para a definição da função.

#include <sys/time.h>

#include <chrono>
#include <ctime>
#include <iostream>

using std::cout;
using std::endl;

int main() {
  struct timeval time_now {};
  gettimeofday(&time_now, nullptr);
  time_t msecs_time = (time_now.tv_sec * 1000) + (time_now.tv_usec / 1000);

  cout << "seconds since epoch: " << time_now.tv_sec << endl;
  cout << "milliseconds since epoch: " << msecs_time << endl << endl;

  return EXIT_SUCCESS;
}

Resultado:

seconds since epoch: 1603612778
milliseconds since epoch: 1603612778389

Utilize a função time() para obter tempo em milissegundos em C++

Outro método compatível com POSIX para recuperar o tempo do sistema em C++ é chamar a função time. O time leva um argumento opcional do tipo time_t*, onde o valor do tempo retornado é armazenado. Alternativamente, pode-se utilizar o valor de retorno da função para armazenar na variável declarada separadamente. Neste último caso, você pode passar o nullptr como o argumento. Observe que esta chamada não retorna o tempo com a mesma precisão das chamadas anteriores.

#include <sys/time.h>

#include <chrono>
#include <ctime>
#include <iostream>

using std::cout;
using std::endl;

int main() {
  time_t now = time(nullptr);
  time_t mnow = now * 1000;

  cout << "seconds since epoch: " << now << endl;
  cout << "milliseconds since epoch: " << mnow << endl << endl;

  return EXIT_SUCCESS;
}

Resultado:

seconds since epoch: 1603612778
milliseconds since epoch: 1603612778000
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ Time