Quiero hacer un script bash que mida el tiempo de inicio de un navegador para el que estoy usando un html que obtiene la marca de tiempo en carga en milisegundos usando JavaScript.
En el script de shell justo antes de llamar al navegador, aparece la marca de tiempo con:
date +%s
El problema es que obtiene la marca de tiempo en segundos, y la necesito en milisegundos, ya que a veces cuando se ejecuta por segunda vez, el navegador se inicia en menos de un segundo y necesito poder medir ese tiempo con precisión usando milisegundos en lugar de segundos.
¿Cómo puedo obtener la marca de tiempo en milisegundos de un script bash?
fuente
$(($(date +'%s * 1000 + %N / 1000000')))
. Eso todavía no tiene mucho sentido, pero sería más confiable.%N
no está disponible en BSD y OS X.echo $(( $(date '+%s%N') / 1000000))
?Con la implementación de GNU o ast-open de
date
(o busybox 'si está construida con laFEATURE_DATE_NANO
opción habilitada), usaría:que devuelve milisegundos desde la época de Unix.
fuente
%3N
hace el relleno de cero a la izquierda necesario (sin leer los documentos. ;-), puede hacerlowhile sleep 0.05; do date +%s%3N; done
, y sí, los ceros necesarios están ahí.%3N
hecho es cero acolchado. Además, no creo que su solución agregue ceros, solo demore la respuesta muy poco.%3N
realidad esté rellenado con 0.En caso de que alguien esté usando otros shells que no sean
bash
,ksh93
yzsh
tenga una$SECONDS
variable de coma flotante si hace algotypeset -F SECONDS
que puede ser útil para medir el tiempo con precisión:Desde la versión 4.3.13 (2011)
zsh
tiene una$EPOCHREALTIME
variable especial de coma flotante en elzsh/datetime
módulo:Tenga en cuenta que eso se deriva de los dos enteros (por segundos y nanosegundos) devueltos por
clock_gettime()
. En la mayoría de los sistemas, eso es más precisión de la quedouble
puede contener un solo número de coma flotante en C , por lo que perderá precisión cuando lo use en expresiones aritméticas (excepto las fechas en los primeros meses de 1970).Para calcular las diferencias de tiempo de alta precisión (aunque dudo que necesite más que una precisión de milisegundos), es posible que desee utilizar la
$epochtime
matriz especial en su lugar (que contiene los segundos y nanosegundos como dos elementos separados).Desde la versión 5.7 (2018), el
strftime
shell incorporado también admite un%N
formato de nanosegundos a la GNUdate
y a%.
para especificar la precisión, por lo que el número de milisegundos desde la época también se puede recuperar con:(o almacenado en una variable con
-s var
)fuente
Para evitar cálculos para obtener los milisegundos, los intérpretes de JavaScript de la línea de comandos pueden ayudar:
Paquetes que contienen esos intérpretes en Ubuntu Eoan:
fuente
En bash 5+ hay una variable con la granularidad micro-segundos:
$EPOCHREALTIME
.Asi que:
Imprime el tiempo desde la época (1/1/70) en milisegundos.
De lo contrario, debe usar la fecha. Ya sea la fecha GNU:
Una de las alternativas enumeradas en https://serverfault.com/a/423642/465827
O
brew install coreutils
para OS XO, si todo lo demás falla, compile (gcc epochInµsec.c) este programa c (ajuste según sea necesario):
Tenga en cuenta que llamar a cualquier programa externo necesita tiempo para leerse y cargarse desde el disco, iniciarse, ejecutarse y finalmente imprimir el resultado. Eso tomará varios milisegundos. Esa es la precisión mínima que se puede lograr con cualquier herramienta externa (incluida la fecha).
fuente