C++ Chrono

Da Andreabont's Wiki.

Chrono è una sezione della libreria standard dedicata alla gestione del tempo, per usarla importare l'header chrono.

Duration

E' possibile esprimere un intervallo temporale attraverso la classe duration. Nella classe possiamo definire il tipo usato per contare e un eventuale rapporto per la conversione (std::ratio), definito a mano oppure usando quelli previsti dalla libreria standard.

#include <chrono>
std::chrono::duration<int> a(1);                 // 1 secondo
std::chrono::duration<int, std::ratio<60>> b(1); // 1 ora (Ratio definito manualmente)
std::chrono::duration<int, std::milli> c(1);     // 1 millisecondo (Ratio fornito dalla libreria standard)
std::chrono::microseconds d(1);                  // 1 microsecondo (Uso un alias fornito dalla stl)

Literals

Dal C++14 esistono dei literals appositi forniti in uno specifico namespace per semplificare la dichiarazione della duration.

#include <chrono>
using namespace std::literals::chrono_literals;
auto a = 12ms; // Ritorna std::chrono::duration<long, ratio<1, 1000>>

Aritmetica

E' possibile effettuare dei calcoli sui duration.

std::chrono::hours a(1);
std::chrono::minutes b(60);

std::cout << (a + b).count() << std::endl; // Scrive 120

Time point

Questa classe rappresenta un dato istante temporale. Essa appartiene a diversi "orologi"

std::chrono::system_clock

Questo orologio corrisponde a quello del sistema operativo, può essere modificato.

#include <iostream>
#include <iomanip>
#include <ctime>
#include <chrono>
std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); // Salva istante attuale
std::time_t now_c = std::chrono::system_clock::to_time_t(now);                // Lo traduce in formato time_t
std::cout << std::put_time(std::localtime(&now_c), "%F %T") << '\n';          // Lo stampa formattandolo

std::chrono::steady_clock

Questo orologio è "bloccato", può solo aumentare, quindi non necessariamente è allineato all'orologio di sistema.

#include <chrono>
#include <iostream>
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
// ...
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

auto t = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
std::cout << "Tempo di esecuzione: " << t << "us.\n";