Imprime o tempo de execução de um comando shell

88

É possível imprimir o tempo de execução de um comando shell com a seguinte combinação?

root@hostname:~# "command to execute" && echo "execution time"
macaco
fonte

Respostas:

72

Não se esqueça de que há uma diferença entre o builtin do bash time(que deve ser chamado por padrão quando você o faz time command) e /usr/bin/time(que deve exigir que você o chame por seu caminho completo).

O embutido timesempre imprime em stderr, mas /usr/bin/timepermitirá que você envie a saída de tempo para um arquivo específico, de forma que você não interfira com o fluxo stderr do comando executado. Além disso, /usr/bin/timeo formato de é configurável na linha de comando ou pela variável de ambiente TIME, enquanto o timeformato embutido do bash é configurado apenas pela TIMEFORMATvariável de ambiente.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
Mark Rushakoff
fonte
De man bash: "A variável TIMEFORMAT pode ser definida como uma string de formato que especifica como as informações de tempo devem ser exibidas"
Pausado até novo aviso.
Ops - pensei que havia uma maneira de formatá-lo, mas não percebi help timeporque apenas dei uma olhada e pensei que era um argumento de linha de comando. Vou atualizar a resposta.
Mark Rushakoff 01 de
2
Aqui estamos, 9 anos depois e o comando levou apenas 0m0.018s. Eu apenas pensei em apontar isso.
Ghassen Louhaichi
112

time é um comando embutido na maioria dos shells que grava informações de tempo de execução no tty.

Você também pode tentar algo como

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Ou em bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
multidão
fonte
concordou com Maaza, essa flexibilidade me permitiu medir o tempo de todo um conjunto de comandos.
Nath
É possível aplicar aspectos do Linux em torno de qualquer comando do Linux para calcular a execução
Syed Mazreena
1
Uma desvantagem dessa abordagem é que ela mede em segundos, enquanto timeusa milissegundos. E se você quiser cronometrar um punhado de comandos sem ter que usar variáveis ​​e cálculos, você pode usar parênteses: time ( command1 ; command2 ; command3 )você pode até mesmo cronometrá-los individualmente com um tempo total, assim: time ( time command1 ; time command2 ; time command3 ) Claro, se você quiser uns vinte comandos, pode seria melhor usar a solução desta resposta. Mas então, você deve começar a pensar em colocar todos os seus comandos em um script ...
msb
25
root@hostname:~# time [command]

Ele também distingue entre o tempo real usado e o tempo do sistema usado.

Jason
fonte
Essa é certamente a resposta básica - mas há algumas complicações se você quiser ver a saída de erro do comando e ainda enviar as informações de tempo para a saída padrão como faz a pergunta. O comando time grava em stderr. O que você sugere é provavelmente preciso o suficiente - daí o meu +1.
Jonathan Leffler
2
timeescreve para o tty, não para o stderr. O que acho que piora as coisas.
mob
12

Para uma medição delta linha por linha, experimente gnonom .

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

Canalizar qualquer coisa para o gnomon acrescentará um carimbo de data / hora a 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.

demonstração gnomon

Janus Troelsen
fonte
8

Adicionando à resposta de @mob:

Anexar %Na date +%snos dá precisão de nanossegundos:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
nav
fonte
5

Se estou iniciando um processo de longa duração, como uma cópia ou hash e quero saber mais tarde quanto tempo demorou, basta fazer o seguinte:

$ date; sha1sum reallybigfile.txt; date

O que resultará na seguinte saída:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

Concedido, conforme implementado aqui, não é muito preciso e não calcula o tempo decorrido. Mas é muito simples e às vezes tudo que você precisa.

Ethan
fonte
4

No zsh você pode usar

=time ...

Em bash ou zsh, você pode usar

command time ...

Estes (por mecanismos diferentes) forçam um comando externo a ser usado.

überRegenbogen
fonte
0

Somente ps -o etime= -p "<your_process_pid>"

Alejandro Galera
fonte