Existe algum comando como o tempo, mas para uso de memória?

34

Existe algum comando como time, mas que reporta mais estatísticas? Seria ótimo se eu pudesse fazer algo como:

$ statistics some_command
time:
    real    0m3.002s
    user    0m0.000s
    sys     0m0.000s
memory:
    min     41K
    peak    2.5M
    mean    1.1M
. . .

Se pudesse ir ainda mais longe, seria ótimo. No momento, para depuração, acabo olhando atentamente top(na verdade glances) ou espalhando instruções por todo o meu código.

Se houvesse algo para o qual eu pudesse passar um comando, isso seria fantástico.

EDITAR

Eu poderia ter encontrado uma solução: perfno pacote linux-toolse linux-tools-commonno Ubuntu 12.04.

$ perf stat ./someprocess
Performance counter stats for './someprocess':

      12007.384578 task-clock                #    0.996 CPUs utilized          
             1,092 context-switches          #    0.000 M/sec                  
                16 CPU-migrations            #    0.000 M/sec                  
           295,102 page-faults               #    0.025 M/sec                  
    40,553,682,299 cycles                    #    3.377 GHz                     [83.33%]
    18,400,458,723 stalled-cycles-frontend   #   45.37% frontend cycles idle    [83.35%]
     8,356,832,355 stalled-cycles-backend    #   20.61% backend  cycles idle    [66.64%]
    56,930,684,595 instructions              #    1.40  insns per cycle        
                                             #    0.32  stalled cycles per insn [83.34%]
     9,083,443,825 branches                  #  756.488 M/sec                   [83.35%]
         3,431,737 branch-misses             #    0.04% of all branches         [83.33%]

      12.051963969 seconds time elapsed

( A página que ajudou. )

Pedro
fonte
3
Não há estatísticas de memória nos seus perfresultados.
BatchyX 28/09/12
"como o tempo, mas a memória" realmente não faz sentido. O que exatamente você quer saber? A memória não é uma medida.
Der Hochstapler
1
Você está procurando auditar um aplicativo que está criando? Se sim, em que idioma?
amigos estão dizendo sobre dset0x

Respostas:

28

zshpossui um timecomando interno mais poderoso do que bashpossui e a zshversão pode relatar estatísticas de memória.

Mesmo que você não use regularmente zshcomo seu shell do dia-a-dia, basta executá-lo quando precisar reunir esses tipos de estatísticas.

Defina a TIMEFMTvariável de ambiente para indicar a saída desejada. Aqui está o que eu tenho no meu .zshrcarquivo (talvez um pouco extravagante, mas eu gosto):

TIMEFMT='%J   %U  user %S system %P cpu %*E total'$'\n'\
'avg shared (code):         %X KB'$'\n'\
'avg unshared (data/stack): %D KB'$'\n'\
'total (sum):               %K KB'$'\n'\
'max memory:                %M MB'$'\n'\
'page faults from disk:     %F'$'\n'\
'other page faults:         %R'

Saída de amostra:

% time ls
[... the output of ls, followed by:]
ls -G   0.00s  user 0.00s system 91% cpu 0.004 total
avg shared (code):         0 KB
avg unshared (data/stack): 0 KB
total (sum):               0 KB
max memory:                668 MB
page faults from disk:     0
other page faults:         337
Mike Morearty
fonte
Sua resposta me ajudou MUITO, mas tenho uma pergunta: 'max memory' está em MB? Eu acredito que é KB ou mesmo B.
Andres
Que bom que ajudou, @Andres. Nos meus testes, 'max memory' está em MB, mas você pode testá-lo compilando gist.github.com/mmorearty/fa34c0f29abe454fd14b e executando-o no zsh com, por exemplo time malloc-bytes 10000000. Isso causará 10 megabytes, então tente e veja o que o zsh informa.
21815 Mike Morearty
De acordo com o zsh docs, %M é a memória máxima em megabytes.
gerrard00
%Mrelatórios em kilobytes
Antti Haapala 26/03
16

O tempo GNU pode relatar um pouco mais de informações do que a versão incorporada no Bash; use em command timevez de apenas timeinvocá-lo e consulte a página de manual ou informações para obter detalhes.

Richard Kettlewell
fonte
2
Ou ligue/usr/bin/time -v ./my_command.sh
ostrokach
3

Com base na resposta de Richard, você pode criar um alias para usar o tempo GNU e fornecer informações de memória média e máxima:

alias time="$(which time) -f '\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem'"

ou ajuste seu ambiente:

export TIME='\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem'

Mas lembre-se de que isso só funciona para o /usr/bin/timequal geralmente não é chamado por padrão.

Na página do manual:

K Uso médio total da memória (dados + pilha + texto) do processo, em Kilobytes.

M Tamanho máximo do conjunto de residentes do processo durante sua vida útil, em Kilobytes.

Dej
fonte