Eu gostaria de fazer o seguinte em um ponto em um script:
start_time=date
e isto depois que um processo ou processos forem executados:
end_time=date
e então faça isto:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Como eu faria isso?
Comentários
-
/usr/bin/time your_script
… - Relacionado: stackoverflow.com/q/8903239/6843677
Resposta
Use o tempo desde a época para identificar facilmente um intervalo de tempo em um script
man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999)
.
start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process
Bash não suporta números de ponto flutuante, então você precisará usar uma ferramenta externa como bc para comparar tempos como 1475705058.042270582-1475705053.040524971
start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process
Comentários
Resposta
O bash tem um variável interna do timer
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Comentários
- Ou
SECONDS=0; ...; echo "$SECONDS"
. No entanto, tome cuidado com esse bug .
Resposta
@jasonwryan já o sugeriu, mas vou colocá-lo como uma resposta, pois também é a minha escolha quando quero cronometrar um script. Para cronometrar myscript , basta usar:
time myscript
Comentários
- Vou tentar fazer isso de vez em quando, mas é mais para quando eu precisar isolar ou cronometrar subseções de meu script.
- Isso não é útil se você quiser usar o tempo decorrido derivado dentro do próprio script, por exemplo, para calcular quantas unidades o script foi capaz de processar por segundo .
Resposta
Gosto da resposta de @Miata “porque chama a atenção para date +%s
solução. No entanto, @Miata inclui .%N
, mas não tenho certeza de qual benefício você obterá olhando os nanossegundos quando houver o custo de execução do date
comando em um subshell. Portanto, na prática, date +%s
deve ser suficiente. A outra coisa a ser observada é a época de date +%s
01/01/1970, 00:00:00 UTC. O que significa que o tempo tem uma época absoluta e você pode compartilhar a medição do tempo entre diferentes instâncias de shell script ou máquinas diferentes.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Gosto de @glenn jackman ” s resposta porque se refere à SECONDS
variável interna do bash. O que se deve notar aqui é que a época é quando o processo foi iniciado. Portanto, só podemos usar essa técnica para medir os tempos de coisas que acontecem dentro desse script:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Outra coisa é que coloco todas as minhas atribuições dentro do (( ))
comando, ou seja, você pode reescrever:
cmd=$(( some_expression ))
como
(( cmd=some_expression ))
Fazendo isso , podemos minimizar a ocorrência do símbolo $
.
date '+%s.%N'
date -u
para evitar DST e problemas locais com o comando. Por favor, leia esta respostaelapsed=$(dc -e "$end_time $start_time - p")