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

26

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, eu acabo olhando atentamente para top (na verdade, glances ), ou borrifando instruções por todo meu código.

Se houvesse algo que eu poderia passar uma ordem, isso seria fantástico.

EDITAR

Eu posso ter encontrado uma solução: perf no pacote linux-tools e linux-tools-common no 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. )

    
por Peter 28.09.2012 / 20:44

3 respostas

21

zsh tem um comando time interno mais poderoso do que bash , e a versão zsh pode relatar estatísticas de memória.

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

Defina a variável de ambiente TIMEFMT para indicar a saída desejada. Aqui está o que eu tenho no meu arquivo .zshrc (talvez um pouco extravagante, mas eu gostei):

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'

Exemplo de saída:

% 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
    
por 11.06.2014 / 18:18
13

O tempo GNU pode reportar um pouco mais de informação do que a versão embutida no Bash; use command time ao invés de apenas time para invocá-lo, e veja a página man ou info para detalhes.

    
por 29.09.2012 / 12:30
2

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 funciona apenas para /usr/bin/time , que geralmente não é chamado por padrão.

Da página do manual:

K Average total (data+stack+text) memory use of the process, in Kilobytes.

M Maximum resident set size of the process during its lifetime, in Kilobytes.

    
por 20.01.2017 / 14:37