Como posso medir o tempo de execução de um processo terminal?

160

Estou tentando medir o tempo de execução de um processo que chamo via linha de comando (ou seja, quero descobrir quanto tempo leva para o processo terminar). Existe algum comando que eu possa adicionar ao comando que chama o processo que conseguirá isso?

htorque
fonte

Respostas:

197

Adicione timeantes do comando que você deseja medir. Por exemplo: time ls.

A saída será semelhante a:

real    0m0.606s
user    0m0.000s
sys     0m0.002s

Explicação sobre real, usere sys(de man time):

  • real: Tempo real decorrido (relógio de parede) usado pelo processo, em segundos.
  • user: Número total de segundos de CPU que o processo usou diretamente (no modo de usuário), em segundos.
  • sys: Número total de segundos de CPU usados ​​pelo sistema em nome do processo (no modo kernel), em segundos.
ninjalj
fonte
1
@ninjalj, você pode fornecer mais informações sobre o que os real, usere sysos tempos são de que esse comando retornará?
Christopher Kyle Horton
2
@JacobVlijm Esta resposta não é tão elaborada. :) Você pode editar no seu comentário e fazê-lo.
Muni
1
Observe que você pode precisar sudo apt-get install timese estiver usando um shell em que timenão esteja embutido.
Pool #
1
Observe que essa é a saída do Bash time, mas man timeseria sobre um executável (como /usr/bin/timeno timepacote), e sua saída pareceria diferente. Também no Bash, você pode help timepedir ajuda com o builtin.
wjandrea 25/03
Observe que o final do processo não significa que todo o trabalho esteja concluído. Uma cópia pode demorar alguns minutos depois que o "tempo" retornar para os buffers do sistema de descarga (portanto, com o tempo de sistema não alocado também).
ubfan1 23/06
43

Para uma medição delta linha a linha, tente o gnomon .

É um utilitário de linha de comando, um pouco como o ts de moreutils, para acrescentar informações de registro de data e hora à saída padrão de outro comando. Útil para processos de longa execução, nos quais você deseja um registro histórico do que está demorando tanto.

A canalização de qualquer coisa para o gnomon precederá um carimbo de data / hora para cada linha, indicando quanto tempo essa linha foi a última linha no buffer - ou seja, quanto tempo levou para a próxima linha aparecer. Por padrão, o gnomon exibirá os segundos decorridos entre cada linha, mas isso é configurável.

demo gnomon

Janus Troelsen
fonte
2
Isso é bem liso.
Nathan Arthur
1
(erro de digitação no link, felizmente URL ok). Você pode instalá-lo sudo npm i gnomon -gse tiver npm. Não tenho certeza de quão bem ele é contra as linhas de "progresso" usando '\ r' (permanecendo na mesma linha): nesse caso, eu gostaria que contasse tudo como uma linha longa, não como linhas separadas.
Tomasz Gandor
então nós o colocamos no gnomon! é isso aí ?
Ciasto piekarz
26

Você pode usar time:

time ls -R
William Niu
fonte
8
date +"%T" && cp -r ./file  /destination/folder/here && date +"%T"

A execução deste comando no terminal fornecerá o tempo total para copiar um arquivo

user314473
fonte
Isso fornecerá o horário de início e de término, não a duração.
wjandrea 25/03
Esta é uma boa resposta, sob algumas circunstâncias. Por exemplo, o seguinte findcomando - sem o 2>/dev/nullredirecionamento - fornece mensagens copiosas Permission denied . No entanto, adicionar 2>/dev/nulla esse comando interrompe a timeparte desse comando. O seguinte fornece um bom compromisso:, START="$(date +"%s")" && find 2>/dev/null / -path /mnt -prune -o -name "*libname-server-2.a*" -print; END="$(date +"%s")"; TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"dando (por exemplo) /usr/lib/libname-server-2.a find command took 3 sec como o único resultado.
Victoria Stuart
Um adendo ao meu comentário: é claro, você pode simplesmente executar time sudo find / -path /mnt -prune -o -name "*libname-server-2.a*" -print(ou seja, como sudo) - evitando esses numerosos Permission deniedavisos.
Victoria Stuart
4

Ocasionalmente, me pego precisando de um cronômetro para contar quanto tempo leva para uma ação como a inicialização do meu aplicativo; nesse caso, muitas das soluções aqui não são úteis.

Para isso, eu gosto de usar sw .

sw

Instalar

wget -q -O - http://git.io/sinister | sh -s -- -u https://raw.githubusercontent.com/coryfklein/sw/master/sw

Uso

sw
 - start a stopwatch from 0, save start time in ~/.sw
sw [-r|--resume]
 - start a stopwatch from the last saved start time (or current time if no last saved start time exists)
 - "-r" stands for --resume
Cory Klein
fonte
0
time -v command

-v dá mais informação

Himanshu Mishra
fonte