Esiste un comando shell in Linux per ottenere il tempo in millisecondi?
date -Ins
Esiste un comando shell in Linux per ottenere il tempo in millisecondi?
date -Ins
Risposte:
date +%s%N
restituisce il numero di secondi + nanosecondi correnti.
Pertanto, echo $(($(date +%s%N)/1000000))
è quello che ti serve.
Esempio:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
restituisce il numero di secondi dall'epoca, se utile.
%N
non è supportato dadate
date +%s%3N
è più veloce (basato sulla risposta di @ michael-defort)
coreutils
dell'utilizzo di MacPorts o Homebrew - quindi utilizzare il gdate
comando. Vedi questa domanda: stackoverflow.com/questions/9804966/…
date +"%T.%N"
restituisce l'ora corrente con nanosecondi.
06:46:41.431857000
date +"%T.%6N"
restituisce l'ora corrente con i nanosecondi arrotondati alle prime 6 cifre, ovvero i microsecondi.
06:47:07.183172
date +"%T.%3N"
restituisce l'ora corrente con i nanosecondi arrotondati alle prime 3 cifre, ovvero i millisecondi.
06:47:42.773
In generale, a ogni campo del date
formato del comando può essere assegnata una larghezza di campo opzionale.
%xN
: bello per la larghezza del campo!
Nano è 10 −9 e milli 10 −3 . Quindi, possiamo usare i primi tre caratteri di nanosecondi per ottenere i millisecondi:
date +%s%3N
Da man date
:
% N nanosecondi (000000000..999999999)
% s secondi dal 1970-01-01 00:00:00 UTC
Fonte: Server Fault Come posso ottenere l'ora corrente di Unix in millisecondi in Bash? .
Su OS X, dove date
non supporta il %N
flag, ti consiglio di installare coreutils
usando Homebrew . Questo ti darà accesso a un comando chiamato gdate
che si comporterà come date
sui sistemi Linux.
brew install coreutils
Per un'esperienza più "nativa", puoi sempre aggiungere questo al tuo .bash_aliases
:
alias date='gdate'
Quindi eseguire
$ date +%s%N
Ecco un hack portatile in qualche modo per Linux per ottenere tempo in millisecondi:
#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3 # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"
millisec=$(( 10*(t2-t1) ))
echo $millisec
L'output è:
3010
Questa è un'operazione molto economica, che funziona con gli interni e i proc della shell.
date
command non ha fornito milli secondi su OS X, quindi ha usato un alias da Python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
O
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
annullato un processo separato, exec
ed il tuo interprete Python, lascia che carichi le sue librerie / altrimenti inizializzi, scriva il suo risultato ed esca, quel risultato non sarà più accurato.
Le altre risposte sono probabilmente sufficienti nella maggior parte dei casi, ma ho pensato di aggiungere i miei due centesimi quando ho riscontrato un problema su un sistema BusyBox .
Il sistema in questione non supportava l' %N
opzione di formattazione e non ha interprete Python o Perl.
Dopo aver grattato la testa, noi (grazie Dave!) Ci siamo inventati questo:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Estrae i secondi e i microsecondi dall'output di adjtimex
(normalmente utilizzato per impostare le opzioni per l'orologio di sistema) e li stampa senza nuove linee (in modo che vengano incollati insieme). Si noti che il campo dei microsecondi deve essere pre-riempito con zeri, ma ciò non influisce sul campo dei secondi che è comunque più lungo di sei cifre. Da questo dovrebbe essere banale convertire i microsecondi in millisecondi.
Se hai bisogno di una nuova riga finale (forse perché sembra migliore) allora prova
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Si noti inoltre che ciò richiede adjtimex
e awk
di essere disponibile. Altrimenti con BusyBox puoi indicarli localmente con:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
E quindi chiama quanto sopra come
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
O ovviamente potresti metterli nel tuo PATH
MODIFICARE:
Quanto sopra ha funzionato sul mio dispositivo BusyBox. Su Ubuntu ho provato la stessa cosa e ho capito che adjtimex
ha versioni diverse. Su Ubuntu ha funzionato per generare il tempo in secondi con i decimali in microsecondi (inclusa una nuova riga finale)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Non lo farei su Ubuntu però. io usereidate +%s%N
Perl può essere usato per questo, anche su piattaforme esotiche come AIX. Esempio:
#!/usr/bin/perl -w
use strict;
use Time::HiRes qw(gettimeofday);
my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime ($t_sec);
printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;
Uno script Python come questo:
import time
cur_time = int(time.time()*1000)
time.time()
restituisce un float a 6 cifre decimali, almeno su macOS.
Volevo solo aggiungere alla risposta di Alper cosa dovevo fare per far funzionare queste cose:
Su Mac, ne avrai bisogno brew install coreutils
, così possiamo usarlo gdate
. Altrimenti su Linux, è solo date
. E questa funzione ti aiuterà a cronometrare i comandi senza dover creare file temporanei o altro:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
E puoi usarlo con una stringa:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Quando si utilizza GNU AWK dalla versione 4.1, è possibile caricare la libreria temporale ed eseguire:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
In questo modo verrà stampata l'ora corrente in secondi dal 1970-01-01T00: 00: 00 con precisione al secondo secondo.
the_time = gettimeofday()
Restituisce il tempo in secondi trascorso dal 1970-01-01 UTC come valore in virgola mobile. Se l'ora non è disponibile su questa piattaforma, tornare-1
e impostareERRNO
. Il tempo restituito dovrebbe avere una precisione inferiore al secondo , ma la precisione effettiva può variare in base alla piattaforma. Se lagettimeofday()
chiamata di sistema C standard è disponibile su questa piattaforma, restituisce semplicemente il valore. Altrimenti, se su MS-Windows, tenta di utilizzareGetSystemTimeAsFileTime()
.fonte: manuale GNU awk
Sui sistemi Linux, la funzione C standard getimeofday()
restituisce il tempo con precisione in microsecondi.
Per mostrare la data con ora e fuso orario
data + "% d-% m-% Y% T.% N% Z"
Uscita: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
ti darebbe nanosecondi, puoi lavorare con quello?