explained - script time linux
Comando para obtener tiempo en milisegundos (9)
¿Hay un comando de shell en Linux para obtener el tiempo en milisegundos?
Aquí hay un truco para Linux de alguna manera portátil para obtener el tiempo en milisegundos:
#!/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
la salida es:
3010
Esta es una operación muy barata, que funciona con shell internos y procfs.
En OS X, donde la date
no admite el indicador %N
, recomiendo instalar coreutils
usando homebrew . Esto le dará acceso a un comando llamado gdate
que se comportará como lo hace date
en los sistemas Linux.
brew install coreutils
Para una experiencia más "nativa", siempre puedes agregar esto a tus .bash_aliases
alias date=''gdate''
luego ejecuta
$ date +%s%N
Las otras respuestas probablemente sean suficientes en la mayoría de los casos, pero pensé que agregaría mis 2 centavos cuando encontré un problema en un sistema de caja ocupada.
El sistema en cuestión no admite la opción de formato %N
y no tiene intérprete de python
o perl
.
Después de rascarnos mucho la cabeza, a (gracias Dave!) Se nos ocurrió esto:
adjtimex | awk ''/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }''
Extrae los segundos y microsegundos de la salida de adjtimex
(normalmente se usa para configurar las opciones para el reloj del sistema) y los imprime sin líneas nuevas (para que se peguen entre sí). Tenga en cuenta que el campo de microsegundos debe rellenarse previamente con ceros, pero esto no afecta al campo de segundos que tiene más de 6 dígitos. De esto debería ser trivial convertir microsegundos a milisegundos.
Si necesita una nueva línea final (tal vez porque se ve mejor), intente
adjtimex | awk ''/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'' && printf "/n"
También tenga en cuenta que esto requiere adjtimex
y awk
para estar disponible. Si no, entonces con busybox puede señalarlos localmente con
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Y luego llamar a lo anterior como
./adjtimex | ./awk ''/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }''
O por supuesto podrías ponerlos en tu PATH
EDITAR:
Lo anterior funcionó en mi dispositivo busybox. En Ubuntu intenté lo mismo y me di cuenta de que adjtimex
tiene diferentes versiones. En Ubuntu, esto funcionó para generar el tiempo en segundos con posiciones decimales a microsegundos (incluida una nueva línea final)
sudo apt-get install adjtimex
adjtimex -p | awk ''/raw time:/ { print $6 }''
Aunque no haría esto en Ubuntu. Yo usaría la date +%s%N
Solo quería agregar a la respuesta de @Alper lo que tenía que hacer para que esto funcionara:
En Mac, necesitarás brew install coreutils
para que podamos usar gdate
. De lo contrario en Linux, su date
justa. Y esta función te ayudará a controlar los comandos sin tener que crear archivos temporales ni nada:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
Y puedes usarlo con una cadena de timeit ''tsc --noEmit''
nano es 10 −9 y milli 10 −3 . Por lo tanto, podemos usar los 3 primeros caracteres de nanosegundos para obtener el mili:
date +%s%3N
De la man date
:
% N nanosegundos (000000000..999999999)
% s segundos desde 1970-01-01 00:00:00 UTC
Fuente: Server Fault''s ¿Cómo obtengo la hora actual de Unix en milisegundos con bash? .
script de python como este:
import time
cur_time = int(time.time()*1000)
date +%s%N
devuelve el número de segundos + nanosegundos actuales.
Por lo tanto, echo $(($(date +%s%N)/1000000))
es lo que necesita.
ex:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
devuelve el número de segundos desde la época, si eso es útil
date
comando date
proporcionó milisegundos en OS X, por lo que usé un alias de python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
O
alias millis=''python -c "import time; print(int(time.time()*1000))"''
date +"%T.%N"
devuelve la hora actual con nanosegundos.06:46:41.431857000
date +"%T.%6N"
devuelve la hora actual con nanosegundos redondeados a los primeros 6 dígitos, que son microsegundos.06:47:07.183172
date +"%T.%3N"
devuelve la hora actual con nanosegundos redondeados a los primeros 3 dígitos, que son milisegundos.06:47:42.773
En general, a cada campo del formato del comando de date
se le puede dar un ancho de campo opcional.