2015-08-19 9 views
7

ho una sola riga di codice nel mio codice application server che mi ottiene il valore timestamp usando steady_clock come illustrato di seguito:chrono steady_clock non sta dando il risultato corretto?

uint64_t now = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count(); 

Ora abbiamo due sistemi machineA che è in esecuzione Ubuntu 12 (gcc 4.6.3 compiler) e ComputerB che è in esecuzione Ubuntu 14 (gcc 4.8.2 compiler).

Ora compiliamo il nostro codice application server utilizzando fare sul un'altraUbuntu 12 VM (which has 4.7.3 compiler) e quindi copiare il file tar che viene generato per machineA e iniziare la nostra assistente di app. Dopo la partenza, la riga di codice precedente viene stampato valore come questo in machineA:

1439944652967 

Ora abbiamo anche compilare il nostro codice del server stessa applicazione tramite make sul un'altraUbuntu 14 VM (which has 4.8.2 compiler) e quindi copiare il file tar che viene generato per machineB e avvia il nostro server delle app. Dopo la partenza, la riga di codice sopra mostra un valore come questo nella macchinaB:

10011360 

Si vede la differenza vero? Sono confuso perché questa è la differenza, non sono in grado di capirlo? Tutto il codice e tutto è lo stesso. Qualcuno ha qualche spiegazione su questo e come posso risolverlo?

Se necessario, posso provare ad aggiungere un codice di debug per vedere cosa c'è di sbagliato nel risolvere questo problema.

risposta

13

Ho paura che ci sia stata una certa confusione su cosa sia std::steady_clock.

time_since_epoch indica la durata dall'inizio dell'orologio, non necessariamente l'epoca Unix. steady_clock garantisce solo di aumentare monotonicamente. Ciò significa che steady_clock si sposta sempre in avanti e che non diminuirà mai.

Non vi è alcuna garanzia su steady_clock che rappresenta qualcosa di significativo. Può essere la durata dall'inizio dell'esecuzione del programma, la durata di accensione del computer, la durata dall'ultimo martedì o praticamente tutto il tempo che continua ad andare avanti.

In altre parole, steady_clock non è in realtà tutto ciò che è utile per dire in tempo reale. È utile solo per misurare il passare del tempo. I suoi usi potrebbero includere qualsiasi situazione in cui hai punto A e punto B e sei curioso della durata tra loro: benchmark, stime di progresso, ecc.

Se stai cercando il per il mondo reale tempo, dovresti esaminare std::system_clock, un orologio che rappresenta l'ora del sistema (cioè l'ora del sistema operativo). È fantastico per raccontare il tempo, ma è piuttosto inutile per misurare i differenziali poiché non è garantito che sia monotono e quasi certamente non viene fornito all'ora legale, agli utenti che regolano i loro orologi e ad altri eventi che possono alterare il tempo reale.

+2

In termini più generali: "tempo" indica che ora è, "orologi" semplicemente andare a segno. –

+0

Buona risposta, ma l'ora legale non avrà alcun impatto su 'system_clock'. 'system_clock' tipicamente tiene traccia del tempo Unix, che è il conteggio dei secondi non saltanti dal 1970-01-01 nel fuso orario UTC. –

+0

@HowardHinnant Non è garantito il monitoraggio di una volta UTC in UNIX e sono quasi sicuro che sia possibile percepire l'ora legale.Secondo lo standard: "Gli oggetti di classe system_clock rappresentano il tempo di orologio da parete dall'orologio in tempo reale del sistema." (sollevato spudoratamente da [qui] (http://stackoverflow.com/questions/13263277/difference-between-stdsystem-clock-and-stdsteady-clock) poiché non ho accesso allo standard al momento). "L'ora dell'orologio a muro" cambia sicuramente a seconda dell'ora legale. – Corbin