361 votes

Commande pour obtenir le temps en millisecondes

Existe-t-il une commande shell sous Linux pour obtenir le temps en millisecondes ?

19 votes

date +%s.%N vous donnerait des nanosecondes, pouvez-vous travailler avec ça ?

1 votes

@Wrikken Ce n'est pas tout à fait portable cependant.

18 votes

Date + "%Y%m%d.%H%M%S%3N" - Généralement j'utilise cette commande pour obtenir la date complète et l'heure unique jusqu'aux milli secondes pour créer les noms de fichiers temporaires dans unix bash script. Si votre système n'est pas capable de supporter les milli secondes, vous pouvez passer aux micro ou nano secondes en utilisant respectivement 3 à 6 et 9.

10voto

Thamme Gowda Points 320

date ne fournit pas les milli secondes sous OS X, donc j'ai utilisé un alias de python.

millis(){  python -c "import time; print(int(time.time()*1000))"; }

OU

alias millis='python -c "import time; print(int(time.time()*1000))"'

EDIT : suite au commentaire de @CharlesDuffy. La bifurcation de tout processus enfant prend du temps supplémentaire.

$ time date +%s%N
1597103627N
date +%s%N  0.00s user 0.00s system 63% cpu 0.006 total

Python continue d'améliorer son temps de démarrage de la VM. et il n'est pas aussi rapide qu'un code compilé en avance sur le temps (tel que le programme date ).

Sur ma machine, cela a pris environ 30ms - 60ms (c'est-à-dire 5x-10x des 6ms prises par date )

$ time python -c "import time; print(int(time.time()*1000))"
1597103899460
python -c "import time; print(int(time.time()*1000))"  0.03s user 0.01s system 83% cpu 0.053 total

Je me suis dit awk est plus léger que python donc awk prend dans la gamme de 6ms à 12ms (c'est-à-dire 1x à 2x de la date) :

$ time awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}'
1597103729525
awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}'  0.00s user 0.00s system 74% cpu 0.010 total

6 votes

...cependant, une fois que vous avez fork() a fait l'objet d'un processus distinct, exec ed votre interpréteur Python, laissez-le charger ses bibliothèques / s'initialiser autrement, écrire son résultat, et sortir, ce résultat ne sera plus exact.

7voto

pghalliday Points 131

Les autres réponses sont probablement suffisantes dans la plupart des cas, mais j'ai pensé ajouter mon grain de sel car j'ai rencontré un problème sur une BusyBox système.

Le système en question ne supportait pas le %N et n'a pas d'interpréteur Python ou Perl.

Après s'être creusé la tête, nous (merci Dave !) avons trouvé ceci :

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

Il extrait les secondes et les microsecondes de la sortie de adjtimex (normalement utilisé pour définir les options de l'horloge système) et les imprime sans nouvelles lignes (pour qu'elles soient collées ensemble). Notez que le champ des microsecondes doit être pré-calculé avec des zéros, mais cela n'affecte pas le champ des secondes qui est plus long que six chiffres de toute façon. A partir de cela, il devrait être trivial de convertir les microsecondes en millisecondes.

Si vous avez besoin d'une nouvelle ligne de queue (peut-être parce que c'est plus joli), essayez alors

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"

Notez également que cela nécessite adjtimex y awk pour être disponible. Si ce n'est pas le cas, BusyBox vous permet de les faire pointer localement avec :

ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk

Et ensuite, appelez ce qui précède comme

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

Ou bien, bien sûr, vous pouvez les mettre dans votre PATH

EDIT :

Ce qui précède a fonctionné sur mon dispositif BusyBox. Sur Ubuntu j'ai essayé la même chose et j'ai réalisé que adjtimex a des versions différentes. Sur Ubuntu, cela fonctionne pour afficher le temps en secondes avec des décimales en microsecondes (y compris une nouvelle ligne de fin).

sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'

Je ne ferais pas cela sur Ubuntu cependant. J'utiliserais date +%s%N

1 votes

Wow, super alternative ! En effet, votre commande fonctionne, mais je n'ai pas la moindre idée du pourquoi. Où puis-je trouver une documentation pour la commande awk ! Comment diable avez-vous trouvé comment construire la chaîne pour extraire l'information désirée de la sortie d'adjtimex ?

1 votes

Une solution busybox géniale

1 votes

Si vous avez la possibilité de compiler Busybox vous-même, l'activation de "CONFIG_FEATURE_DATE_NANO" serait une autre approche.

4voto

Anil Agrawal Points 1076

Pour afficher la date avec l'heure et le fuseau horaire

date + "%d-%m-%Y %T.%N %Z"

Sortie : 22-04-2020 18:01:35.970289239 IST

4voto

Socowi Points 6380

Solution purement bash

Depuis bash 5.0 ( publié le 7 janvier 2019 ), vous pouvez utiliser la variable intégrée EPOCHREALTIME qui contient les secondes depuis l'époque, y compris les décimales jusqu'à la précision de la micro-seconde (s) ( echo $EPOCHREALTIME imprime quelque chose comme 1547624774.371215 ). En retirant le . et aux trois derniers endroits, nous obtenons des millisecondes :

Soit utiliser

(( t = ${EPOCHREALTIME/./} / 1000 ))

ou quelque chose comme

t=${EPOCHREALTIME/./}
t=${t%???}

D'une manière ou d'une autre t sera quelque chose comme 1547624774371 .

3voto

Chet Points 680

Je voulais juste ajouter à Réponse d'Alper ce que j'ai dû faire pour que ce truc fonctionne :

Sur Mac, vous aurez besoin de brew install coreutils donc on peut utiliser gdate . Sinon, sous Linux, c'est juste date . Et cette fonction vous aidera à chronométrer les commandes sans avoir à créer de fichiers temporaires ou quoi que ce soit :

function timeit() {
    start=`gdate +%s%N`
    bash -c $1
    end=`gdate +%s%N`
    runtime=$(((end-start)/1000000000.0))
    echo " seconds"
}

Et vous pouvez l'utiliser avec une chaîne :

timeit 'tsc --noEmit'

1 votes

J'aime cette solution mais je suis plus intéressé par les millis. J'ai porté cette fonction dans mon .bashrc sous ubuntu : function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X