Calcolare la durata quando si dispone di ore, minuti, secondi e millesimi di secondo
-
26-10-2019 - |
Domanda
Sto scrivendo un programma in Fortran e ho bisogno di un modo di calcolare la durata del programma di basso per millisecondi. Sono stato con la funzione "DATE_AND_TIME", che mi lascia con una matrice contenente il tempo del sistema in ore, minuti, secondi e millesimi di secondo.
Credo che posso chiamare questa funzione all'inizio del mio programma per memorizzare l'ora corrente, quindi chiamare di nuovo la funzione alla fine del mio programma per memorizzare l'ora più recente. Ma dopo che, come faccio di computer la durata? Ho provato solo sottraendo i valori, ma i millisecondi resettato quando si passa al secondo, proprio come i secondi ripristinati quando sia trascorso un minuto. Come sarebbe modo migliore per affrontare questo?
Ecco il programma:
PROGRAM TEST_TIME_AND_DATE
INTEGER I
REAL J
INTEGER TIME_A(8), TIME_B(8)
CALL DATE_AND_TIME(VALUES=TIME_A)
PRINT '(8I5))', TIME_A
DO I = 0, 400000000
J = I * I - J
END DO
CALL DATE_AND_TIME(VALUES=TIME_B)
print '(8I5))', TIME_B
END PROGRAM TEST_TIME_AND_DATE
Ed ecco il risultato:
2011 6 11 -300 9 14 49 304
2011 6 11 -300 9 14 50 688
Non sono sicuro di cosa fare qui, grazie.
Soluzione
È possibile sottrarre i numeri, poi convertire tutto in millisecondi e riassumere le ms, sec in ms, min in ms, ore in ms, ...
Nel tuo caso questo sarebbe
0 + 0 + 0 + 0 + 0 + 1*1000 + 384 = 1384 [ms]
Questo approccio funziona bene anche con overflow poiché un numero positivo in una sinistra più colonna outweights numeri negativi se sono tutti convertiti stessa base. Per esempio. 0:58.000
ai rendimenti 1:02.200
1 * 60000 + (-56) * 1000 + 200 = 4200
Si noti che questo funziona fino a giorni, ma non con mesi dal momento che non condividono una lunghezza comune.
Altri suggerimenti
Se si desidera che il tempo trascorso orologio, sarebbe più semplice utilizzare la procedura intrinseca system_clock in quanto fornisce una singola uscita time value. (Ci sono argomenti aggiuntivi per fornire informazioni sulla procedura, è per questo che è una procedura invece di una funzione.) Si veda, ad esempio, http://gcc.gnu.org/onlinedocs/gfortran/SYSTEM_005fCLOCK.html . Se si vuole il tempo l'utilizzo della CPU, quindi utilizzare cpu_time. Per entrambi, due chiamate, all'inizio e alla fine del programma, quindi una semplice differenza. È possibile utilizzare l'argomento COUNT_RATE da convertire in numero intero di tempo in secondi.
Si potrebbe calcolare l'offset da qualche tempo di inizio (1 gennaio 1970 per UNIX) in secondi o millisecondi. La differenza di quei numeri è il vostro tempo trascorso.
(2011 - 1970) * (number of seconds in a year) +
(month of the year - 1) * (number of seconds in a month) +
(day of the month - 1) * (number of seconds in a day) +
( ... )