¿Hay algún comando como el tiempo, pero para el uso de la memoria?

34

¿Hay algún comando como time, pero que informa más estadísticas? Sería genial si pudiera hacer algo como:

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

Si pudiera ir más allá, sería genial. En este momento, para la depuración, termino mirando fijamente top(en realidad glances) o rociando declaraciones a través de mi código.

Si hubiera algo a lo que pudiera pasarle un comando, sería fantástico.

EDITAR

Podría haber encontrado una solución: perfen el paquete linux-toolsy linux-tools-commonen 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

( La página que ayudó ) .

Peter
fuente
3
No hay estadísticas de memoria en sus perfresultados.
BatchyX
"como el tiempo pero para la memoria" realmente no tiene sentido. ¿Qué es exactamente lo que quieres saber? La memoria no es una medida.
Der Hochstapler
1
¿Estás buscando auditar una aplicación que estás haciendo? Si es así, ¿en qué idioma?
dset0x

Respuestas:

28

zshtiene un timecomando incorporado más potente que el que bashtiene, y la zshversión puede informar estadísticas de memoria.

Incluso si no lo usa regularmente zshcomo su shell diario, simplemente puede ejecutarlo cuando necesite recopilar este tipo de estadísticas.

Establezca la TIMEFMTvariable de entorno para indicar la salida que desea. Esto es lo que tengo en mi .zshrcarchivo (quizás un poco demasiado elegante, pero me gusta):

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'

Salida de muestra:

% 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
fuente
Su respuesta me ayudó MUCHO, pero tengo una pregunta: ¿es 'memoria máxima' en MB? Creo que es KB o incluso B.
Andres
Me alegra que haya ayudado, @Andres. En mis pruebas, 'memoria máxima' está en MB, pero puede probarlo usted mismo compilando gist.github.com/mmorearty/fa34c0f29abe454fd14b y ejecutándolo en zsh con, por ejemplo time malloc-bytes 10000000. Eso mallocará 10 megabytes, así que pruébelo y luego vea qué informa zsh.
Mike Morearty
Según los documentos zsh %M es la memoria máxima en megabytes.
gerrard00
%Minformes en kilobytes
Antti Haapala
16

El tiempo de GNU puede informar un poco más de información que la versión integrada en Bash; use en command timelugar de solo timeinvocarlo, y vea la página de manual o la información para más detalles.

Richard Kettlewell
fuente
2
O una llamada/usr/bin/time -v ./my_command.sh
ostrokach
3

Según la respuesta de Richard, puede crear un alias para usar el tiempo GNU y proporcionar información de memoria promedio y máxima:

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

o ajusta tu entorno:

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

Pero tenga en cuenta que esto solo funciona para lo /usr/bin/timeque a menudo no se llama de forma predeterminada.

Desde la página del manual:

K Promedio de uso de memoria total (datos + pila + texto) del proceso, en kilobytes.

M Tamaño máximo del conjunto residente del proceso durante su vida útil, en kilobytes.

Dej
fuente