Caso alguém esteja usando outras conchas além de bash
, ksh93
e zsh
tenha uma variável de ponto flutuante $SECONDS
, se você fizer uma typeset -F SECONDS
que possa ser útil para medir o tempo com precisão:
$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed
Desde a versão 4.3.13 (2011), zsh
há uma $EPOCHREALTIME
variável especial de ponto flutuante no zsh/datetime
módulo:
$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993
Observe que isso é derivado dos dois números inteiros (por segundos e nanossegundos) retornados por clock_gettime()
. Na maioria dos sistemas, isso é mais preciso do que um único double
número de ponto flutuante C pode suportar; portanto, você perderá a precisão ao usá-lo em expressões aritméticas (exceto para datas nos primeiros meses de 1970).
$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064
Para calcular diferenças de tempo de alta precisão (embora eu duvide que você precise mais do que milissegundos de precisão), convém usar a $epochtime
matriz especial (que contém os segundos e os nanossegundos como dois elementos separados).
Desde a versão 5.7 (2018), o strftime
shell interno também suporta um %N
formato de nanossegundo à GNU date
e a %.
para especificar a precisão, portanto, o número de milissegundos desde a época também pode ser recuperado com:
zmodload zsh/datetime
strftime %s%3. $epochtime
(ou armazenado em uma variável com -s var
)