2014-09-30 13 views
11

Come si stampa un punto_tempo quando il punto_tempo viene ottenuto da high_resolution_clock?C++ 11 come stampare l'orologio ad alta risoluzione time_point

timestamp = std::chrono::high_resolution_clock::now(); 
std::time_t now = std::chrono::system_clock::to_time_t(timestamp); 
std::cout << std::ctime(&now) << std::endl; 

ricevo il seguente messaggio di errore durante la compilazione:

error: no viable conversion from 'time_point<class std::__1::chrono::steady_clock, duration<[...], ratio<[...], 1000000000>>>' to 'const time_point<class std::__1::chrono::system_clock, duration<[...], ratio<[...], 1000000>>>' 
     time_t tt = std::chrono::system_clock::to_time_t(timestamp); 
+0

È possibile risolvere una durata trascorsa: 'duration_cast > (stop - start) .count()' –

risposta

13

Non c'è modo veramente elegante per fare questo. high_resolution_clock non è noto per essere correlato a UTC o qualsiasi altro calendario. Una cosa si può portabile fare è uscita la sua durata corrente dalla sua epoca non precisata, insieme con le unità di quella durata:

#include <chrono> 
#include <iostream> 

int 
main() 
{ 
    using Clock = std::chrono::high_resolution_clock; 
    constexpr auto num = Clock::period::num; 
    constexpr auto den = Clock::period::den; 
    std::cout << Clock::now().time_since_epoch().count() 
       << " [" << num << '/' << den << "] units since epoch\n"; 
} 

che per me uscite:

516583779589531 [1/1000000000] units since epoch 

che significa che è 516583779589531 nanosecondi (o 516,583,779589531 secondi) dall'epoca di questo orologio sulla mia macchina. Sulla mia macchina questo si traduce in: la mia macchina è stata avviata per circa 6 giorni. Ma quella traduzione non è portatile.

Ah! E noto dal tuo messaggio di errore che stai usando libc++. Se sei anche su OS X, allora abbiamo la stessa definizione di high_resolution_clock: conta i nanosecondi da quando il tuo computer è stato avviato.

+0

Grazie per la spiegazione - anche se il messaggio di errore è libC++, il codice deve essere indipendente dalla piattaforma (almeno per OSX, Windows, Linux), quindi speravo in una facile vittoria. Sembra strano che non ci sia un collegamento tra high_resolution_clock e l'ora del sistema, vabbè. Ho implementato usando system_clock per ora. – John

3

Almeno mentre leggo le cose, l'intento è che std::high_resolution_clock potrebbe essere definito come un wrapper attorno a qualcosa come il contatore di data/ora di una CPU, che è semplicemente un registro che incrementa ogni ciclo di clock della CPU.

Questo non è necessariamente il caso (e con i sistemi attuali che modificano costantemente la frequenza del clock della CPU probabilmente una cattiva idea), ma anche altri orologi simili sono previsti per essere supportati.

Bottom line: potrebbe non esserci una relazione nota tra il tempo assoluto e il clock ad alta risoluzione, quindi è veramente definita solo per produrre durate, non per i tempi assoluti.

Problemi correlati