Cross Platform millisecondo timer di durata superiore a 49 giorni?
-
24-09-2019 - |
Domanda
ho intenzione di essere lo sviluppo di un piccolo server dedicato in C / C ++ che richiederà tempi di attività di sempre. Ho cercato in alcune funzioni di tempo, come è richiesto tempi millisecondo per i calcoli. Ho 2 problemi che sto di fronte:
-
Utilizzo di un numero intero a 32 bit per memorizzare il numero di millisecondi da quando l'operazione è iniziata sarà avvolgere a circa 49 giorni segnano il ripristino a zero. Ho pensato di usare 64 bit interi, usando gettimeofday per recuperare microsecondi, ma questo mi porta alla seconda parte.
-
Non ci sembra essere tutte le chiamate di sistema standard per ottenere millisecondi trascorsi che sono indipendente dalla piattaforma
Cosa devo fare per risolvere entrambi questi problemi?
Soluzione
-
Usa un intero a 64 bit, presumendo che ti dà abbastanza tempo
-
Hai ragione; non esiste uno standard. Una possibilità sarebbe quella di utilizzare la libreria Boost DateTime , alternativamente trovare un altro o roll your own.
Buona fortuna!
Altri suggerimenti
Come già si è detto, il primo problema che si sta per confrontarsi sta per ottenere un tempo di millisecondo-precisione affidabile.
Devo ammettere che sono un po 'gradualmente dalla domanda però.
Posso capire la necessità di tempi precisi (livello di millisecondo, anche microsecondo), ma di temporizzazione a 50 giorni ad un livello di millisecondo sembra ... strana.
Si dovrebbe forse rivedere il vostro bisogno prima, ma è raro bisogno più di 6 o 7 cifre significative ... e temo che si sta tentando di ottenere un un formato misura tutti oggetto di durata.
Forse che si dovrebbe invece classificare i vostri durate:
- un paio di minuti al massimo> uso millisecondo di precisione
- altrimenti> utilizzare secondo precisione (il famoso conteggio dal 1 gennaio 1970)
Perché ... qual è il senso di 1/10 di secondo alla scala di 2 mesi?
Ovvio. Utilizzare interi a 64 bit con il codice di piattaforma specifica per ottenere il numero di millisecondi. Su Unix tra cui OSX, si vuole gettimeofday
. Su Windows, buona fortuna per avere una fonte di tempo millisecondo-granularità affidabile; nella libreria Tcl per fare questo è davvero complessa in quanto vi sono alcuni trucchi del male nella zona.
risposta a 1: se il "timing millisecondo", che si sta misurando è sotto di circa 20 giorni, è possibile sottrarre i tempi come valori senza segno e controllare il risultato come valore con segno. Questo dovrebbe dare il giusto risultato con avvolgimento timer (confezione da 0xffffffff a 0x00000000). Se i tempi sono più di 20 giorni, è necessario più bit.