obter o tempo decorrido em bash

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

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

  • isso é o que Eu estava procurando … isso pode incluir microtempo?
  • Tente date '+%s.%N'
  • Você deve ligar para date com date -u para evitar DST e problemas locais com o comando. Por favor, leia esta resposta
  • Vendo como (tradicionalmente) bc é implementado com dc, você pode usar dc diretamente: elapsed=$(dc -e "$end_time $start_time - p")

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 $.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *