Gibt es in Linux einen Shell-Befehl, um die Zeit in Millisekunden zu ermitteln?
date +%s%N
gibt die Anzahl der Sekunden + aktuellen Nanosekunden zurück.
Deshalb brauchen Sie echo $(($(date +%s%N)/1000000))
.
ex:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
gibt die Anzahl der Sekunden seit der Epoche zurück, falls dies nützlich ist
date +"%T.%N"
gibt die aktuelle Uhrzeit mit Nanosekunden zurück.
06:46:41.431857000
date +"%T.%6N"
gibt die aktuelle Uhrzeit mit Nanosekunden zurück, die auf die ersten 6 Ziffern (Mikrosekunden) gerundet sind.
06:47:07.183172
date +"%T.%3N"
gibt die aktuelle Zeit mit Nanosekunden zurück, die auf die ersten 3 Ziffern gerundet sind, also Millisekunden.
06:47:42.773
Im Allgemeinen kann jedem Feld des Befehls date
eine optionale Feldbreite zugewiesen werden.
nano ist 10−9 und milli 10−3. Daher können wir die 3 ersten Zeichen von Nanosekunden verwenden, um die Milli zu erhalten:
date +%s%3N
Von man date
:
% N Nanosekunden (000000000..999999999)
% s Sekunden seit 1970-01-01 00:00:00 UTC
Quelle: Server Fault's Wie erhalte ich mit Bash die aktuelle Unix-Zeit in Millisekunden? .
Unter OS X, wo date
das %N
-Flag nicht unterstützt, empfehle ich, coreutils
mit homebrew zu installieren. Dadurch erhalten Sie Zugriff auf einen Befehl mit dem Namen gdate
, der sich auf Linux-Systemen wie date
verhält.
brew install coreutils
Für eine "native" Erfahrung können Sie dies immer zu Ihrem .bash_aliases
hinzufügen.
alias date='gdate'
dann ausführen
$ date +%s%N
Der Befehl date
lieferte keine Millisekunden unter OS X, daher wurde ein Alias aus Python verwendet
millis(){ python -c "import time; print(int(time.time()*1000))"; }
OR
alias millis='python -c "import time; print(int(time.time()*1000))"'
Die anderen Antworten sind wahrscheinlich in den meisten Fällen ausreichend, aber ich dachte, ich würde meine 2 Cents hinzufügen, da ich auf einem System mit einer ausgelasteten Box auf ein Problem stieß.
Das betreffende System unterstützte die Formatoption %N
nicht und hat keinen python
- oder Perl
-Interpreter.
Nach vielem Kopfkratzen haben wir uns (danke Dave!) Folgendes ausgedacht:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Es extrahiert die Sekunden und Mikrosekunden aus der Ausgabe von adjtimex
(normalerweise verwendet, um Optionen für die Systemuhr einzustellen) und druckt sie ohne neue Zeilen (damit sie zusammengeklebt werden). Beachten Sie, dass das Mikrosekunden-Feld mit Nullen aufgefüllt werden muss. Dies wirkt sich jedoch nicht auf das Sekunden-Feld aus, das ohnehin länger als 6 Stellen ist. Es sollte daher trivial sein, Mikrosekunden in Millisekunden umzuwandeln.
Wenn Sie eine neue Zeile benötigen (vielleicht, weil sie besser aussieht), dann versuchen Sie es
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Beachten Sie auch, dass hierfür adjtimex
und awk
verfügbar sein müssen. Wenn nicht, dann können Sie mit busybox lokal auf sie zeigen
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Und dann rufe das oben als an
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Oder Sie könnten sie natürlich in Ihre PATH
setzen
BEARBEITEN:
Das oben genannte funktionierte auf meinem Gerät "busybox". Auf Ubuntu habe ich dasselbe ausprobiert und festgestellt, dass adjtimex
verschiedene Versionen hat. Auf Ubuntu funktionierte dies, um die Zeit in Sekunden mit Dezimalstellen in Mikrosekunden auszugeben (einschließlich einer neuen Zeile).
Sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Ich würde das allerdings nicht auf Ubuntu machen. Ich würde date +%s%N
verwenden
hier ist ein irgendwie tragbarer Hack für Linux, um Zeit in Millisekunden zu bekommen:
#!/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
die Ausgabe ist:
3010
dies ist eine sehr billige Operation, die mit Shell-Interna und Procfs arbeitet
Ich wollte der Antwort von @ Alper nur hinzufügen, was ich tun musste, um dieses Zeug zum Laufen zu bringen:
Auf einem Mac benötigen Sie brew install coreutils
, damit wir gdate
verwenden können. Ansonsten ist es unter Linux nur date
. Und diese Funktion hilft Ihnen, Befehle zu erledigen, ohne temporäre Dateien oder ähnliches erstellen zu müssen:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
Und Sie können es mit einem String verwenden timeit 'tsc --noEmit'
Perl kann dafür verwendet werden, auch auf exotischen Plattformen wie AIX. Beispiel:
#!/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;
python-Skript wie folgt:
import time
cur_time = int(time.time()*1000)