script explained linux bash shell time

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.