Como posso criar um perfil de um script de shell?

7

Eu tenho vários programas que estou executando em um script de shell:

./myprogram1
./myprogram2
...

Eu sei que posso criar um perfil para cada programa individual editando o código-fonte, mas queria saber se havia uma maneira de medir o tempo total executado ao criar o perfil do próprio script. Existe um programa temporizador que eu possa usar para esse propósito? Se sim, quão precisa é a sua medição?

    
por Paul 30.05.2012 / 04:00

4 respostas

7

Comece usando o tempo de acordo com a sugestão de Jon Lin:

$ time ls test
test

real    0m0.004s
user    0m0.002s
sys     0m0.002s

Você não diz em qual UNIX seus scripts estão sendo executados, mas strace no Linux, truss no Solaris / AIX, e eu acho que o tusc no hp-ux permite que você aprenda muito sobre o que um processo está fazendo. Eu gosto da opção -c do strace para obter um bom resumo:

]$ strace -c ls
test
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 89.19    0.000998         998         1           execve
 10.81    0.000121         121         1           write
  0.00    0.000000           0        12           read
  0.00    0.000000           0        93        79 open
  0.00    0.000000           0        16           close
  0.00    0.000000           0         2         1 access
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         4           munmap
  0.00    0.000000           0         1           uname
  0.00    0.000000           0         6           mprotect
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0        30           mmap2
  0.00    0.000000           0         8         7 stat64
  0.00    0.000000           0        13           fstat64
  0.00    0.000000           0         2           getdents64
  0.00    0.000000           0         1           fcntl64
  0.00    0.000000           0         1           futex
  0.00    0.000000           0         1           set_thread_area
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           socket
  0.00    0.000000           0         1         1 connect
------ ----------- ----------- --------- --------- ----------------
100.00    0.001119                   205        88 total

Observe também que anexar esses programas do tipo rastreio pode atrasar um pouco o programa.

    
por 30.05.2012 / 15:21
4

Confira o time command . Você pode usá-lo para medir o tempo que leva para executar junto com outras informações úteis, como onde o tempo está sendo gasto.

    
por 30.05.2012 / 07:22
2

Não é exatamente o perfil, mas você pode rastrear seu script enquanto ele é executado. Coloque set -xv antes da seção que você deseja rastrear e set +xv após a seção. set -x ativa o xtrace, que mostrará todas as linhas que são executadas. set -v ativa o modo detalhado, que também mostra linhas que podem ter um efeito, mas não são executadas, como atribuição de variável.

Você também pode marcar seu rastreio com timestamp. Você precisa de um emulador de terminal que possa registrar cada linha de tempo; o único que eu conheço é o RealTerm , que é um programa do Windows, mas funcionará com o Wine. Você também pode usar grabserial , embora eu não tenha tentado, exceto com portas seriais reais. Você pode descobrir qual dispositivo serial seu shell está usando executando ps -p $$ (se isso não ocorrer, use man para descobrir como incluir a coluna TTY na sua saída ps ).

Além disso, consulte Ferramentas de criação de perfil de desempenho para scripts de shell no Stack Overflow.

    
por 30.05.2012 / 14:18
1

time para várias iterações

Criação de perfil executando o mesmo comando várias vezes

time (for ((n=0;n<10;n++)); do echo "scale=1000; 4*a(1)" | bc -l; done)

Em que echo "scale=1000; 4*a(1)" | bc -l calcula pi e time (...) garante que o loop for seja executado como um único comando.

    
por 20.11.2017 / 13:34