Gostaria de exibir o tempo de conclusão de um script.
O que eu faço atualmente é -
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
Isso mostra apenas a hora do início e do fim do script. Seria possível exibir uma saída refinada, como tempo do processador / tempo io, etc?
Respostas:
Basta usar
time
quando você chamar o script:fonte
real
,user
esys
. Para os significados destes, veja aqui .time $( ... ) >> out.txt
time (command1 && command2)
Se
time
não for uma opção,fonte
date
duas vezes, por exemplo, para obter, na melhor das hipóteses, precisão de milissegundos na prática e provavelmente menos), tente usardate +%s.%N
. (%N
são nanossegundos desde o segundo inteiro.)date +%s%N
ou use algo mais capaz, comobc
calcular o tempo de execução real a partir dos dois valores sugeridos por jwchew. Ainda assim, acho que essa abordagem é uma maneira subótima de fazer isso;time
é consideravelmente melhor se disponível, pelas razões descritas acima.bc
e, em seguida, fazer o seguinte:runtime=$( echo "$end - $start" | bc -l )
echo "Duration: $((($(date +%s)-$start)/60)) minutes
Basta ligar
times
sem argumentos ao sair do seu script.Com
ksh
ouzsh
, você também pode usartime
. Comzsh
,time
também fornecerá a hora do relógio de parede, além da hora da CPU do usuário e do sistema .Para preservar o status de saída do seu script, você pode:
Ou você também pode adicionar uma armadilha em
EXIT
:Dessa forma, os horários serão chamados sempre que o shell sair e o status de saída for preservado.
Observe também que todos
bash
,ksh
ezsh
tem uma$SECONDS
variável especial que automaticamente é incrementado a cada segundo. Em amboszsh
eksh93
, essa variável também pode ser feita de ponto flutuante (comtypeset -F SECONDS
) para obter mais precisão. Esta é apenas a hora do relógio de parede, não da CPU.fonte
time
abordagem apresentada anteriormente. - - Acho que atimeit
abordagem apresentada no código MATLAB pode ser útil aqui.times
que não dá tempo para a parede, certo? por exemplo,bash -c 'trap times EXIT;sleep 2'
Estou um pouco atrasado para o movimento, mas queria postar minha solução (para precisão de menos de um segundo), caso outras pessoas encontrassem esse tópico através da pesquisa. A saída está no formato de dias, horas, minutos e finalmente segundos:
Espero que alguém ache isso útil!
fonte
date
não suporta precisão de sub-segundo e apenas anexa literal “N
” ao registro de data e hora.dt2=$(echo "$dt%86400" | bc)
. Só estou dizendo ... BTW, prefiro o formulário,dt2=$(bc <<< "${dt}%86400")
mas isso é totalmente pessoal.Meu método para
bash
:fonte
Sim, isso chama Python, mas se você pode conviver com isso, é uma solução concisa e agradável.
fonte
python
comando em um subshell e ler sua saída levará vários milhões de nanossegundos na maioria dos sistemas atuais. O mesmo para correrdate
.Esta pergunta é bastante antiga, mas, ao tentar encontrar minha maneira favorita de fazer isso, esta discussão surgiu ... e estou surpreso que ninguém tenha mencionado:
'perf' é uma ferramenta de análise de desempenho incluída no kernel em 'tools / perf' e frequentemente disponível para instalação como um pacote separado ('perf' no CentOS e 'linux-tools' no Debian / Ubuntu). O Linux Kernal perf Wiki tem muito mais informações sobre ele.
A execução do 'perf stat' fornece vários detalhes, incluindo o tempo médio de execução no final:
fonte
perf
?perf stat
agora reclama sobre "Você pode não ter permissão para coletar estatísticas". a menos que você execute alguns comandossudo
, o que o torna inútil em todos os cenários em que você não possui completamente a máquina de destino.Uma pequena função de shell que pode ser adicionada antes dos comandos para medir seu tempo:
Em seguida, use-o no seu script ou na sua linha de comando da seguinte maneira:
fonte
s=$(date +%s000)
, não tenho certeza se funciona.Aqui está uma variação da resposta de Alex. Eu me importo apenas com minutos e segundos, mas também queria que ele fosse formatado de maneira diferente. Então eu fiz isso:
fonte
fonte
date
antes e depois do script e produzem a diferença entre elas?Usando apenas o bash, também é possível medir e calcular a duração do tempo para uma parte do script shell (ou o tempo decorrido para o script inteiro):
agora você pode simplesmente imprimir a diferença:
se você precisar apenas de duração incremental, faça:
Você também pode armazenar a duração em uma variável:
fonte
Pessoalmente, eu gosto de agrupar todo o meu código de script em alguma função "principal" como:
Observe como é fácil usar o
time
comando neste cenário. Obviamente, você não está medindo o tempo exato, incluindo o tempo de análise de script, mas acho preciso o suficiente na maioria das situações.fonte
fonte
A função de tempo baseada em
SECONDS
, limitada apenas à granularidade de segundo nível, não usa nenhum comando externo:Por exemplo:
dá
fonte