Como você calcula quanto tempo um comando demorou para ser executado? [duplicado]

20

Como você descobriria quanto tempo um processo de execução levou para ser concluído?

Exemplo:

 date; dd bs=1m if=/foo of=bar; date

^ Este exemplo tem apenas 1 segundo de resolução.

Qualquer shell é aceitável.

    
por spuder 14.08.2013 / 00:15

1 resposta

40

use time :

$ time longrunningcommand --takeyourtime

time executará o restante da linha de comando como um comando (neste exemplo, longrunningcommand --takeyourtime ) e, quando o comando estiver concluído, imprimirá o tempo decorrido.

outro exemplo: time foo --bar executará foo --bar e aguardará a conclusão e, em seguida, imprimirá o tempo decorrido.

time é um comando embutido na maioria dos shells. a diferença do shell embutido e do comando do sistema é principalmente o formato da saída. veja abaixo para mais detalhes sobre as diferenças.

se você quiser usar o sistema time , faça assim:

$ /usr/bin/time longrunningcommand --getsomecoffee

ou assim:

$ \time longrunningcommand --callmom
$ command time longrunningcommand --callmom

a barra invertida funciona no bash e talvez em algumas outras shells. command funciona na maioria dos shells.

exemplos mais elaborados

exemplo longrunningcommand :

#!/bin/sh

echosleep() {
  seq $1 | while read tick; do
    echo $tick
    sleep 1
  done
  echo done
}

case $1 in
  --takeyourtime) echosleep 4 ;;
  --getsomecoffee) echosleep 5 ;;
  --callmom) echosleep 6 ;;
  *) echo wat ;;
esac

invocação de exemplo:

$ ./longrunningcommand --takeyourtime
1
2
3
4
done

(com atraso entre cada linha de saída)

invocação de exemplo usando bash builtin time :

$ time ./longrunningcommand --getsomecoffee
1
2
3
4
5
done

real    0m5,020s
user    0m0,010s
sys 0m0,010s

as informações interessantes são real 0m5,020s . Para obter mais informações sobre os outros números, consulte: link

invocação de exemplo usando o sistema time :

$ \time ./longrunningcommand --callmom
1
2
3
4
5
6
done
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps

as informações interessantes são 0:06.02elapsed . para o significado dos outros números, leia a página de manual do time : link

você pode alterar a saída do sistema time . observe:

$ \time sleep 0.5
0.00user 0.00system 0:00.50elapsed 0%CPU (0avgtext+0avgdata 2376maxresident)k
0inputs+0outputs (0major+81minor)pagefaults 0swaps
$ \time -p sleep 0.5
real 0.50
user 0.00
sys 0.00
$ \time -f %E sleep 0.5
0:00.50

como redirecionar ou capturar a saída

para demonstração, observe o comando hellostdoutstderr :

#!/bin/sh
sleep 0.5
echo stdout
echo stderr >&2

invocações de exemplo:

 $ ./hellostdoutstderr 
stdout
stderr
$ ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr

o bash builtin time imprime o terminal mesmo que stdout e stderr sejam redirecionados porque ele é construído e pode fazer o que quiser (no shell)

$ time ./hellostdoutstderr >stdout 2>stderr

real    0m0,511s
user    0m0,005s
sys 0m0,006s

para ainda redirecionar essa saída, leia aqui:

ou aqui: link

o sistema time imprime para stderr como deveria

$ \time ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps

você pode dizer a time para imprimir em um arquivo separado

$ \time -o timeout ./hellostdoutstderr >stdout 2>stderr
$ cat stderr
stderr
$ cat timeout 
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps
    
por 14.08.2013 / 00:20

Tags