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

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

¿Existe algún comando como time, pero que informe 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 aún más lejos, sería fantástico. En este momento, para la depuración, termino mirando fijamente top(en realidad glances) o esparciendo declaraciones por todo 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ó.)

Respuesta1

zshtiene un comando incorporado más potente timeque bashel que tiene y la zshversión puede informar estadísticas de memoria.

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

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

if [[ `uname` == Darwin ]]; then
    MAX_MEMORY_UNITS=KB
else
    MAX_MEMORY_UNITS=MB
fi

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 '$MAX_MEMORY_UNITS''$'\n'\
'page faults from disk:     %F'$'\n'\
'other page faults:         %R'

(Un detalle complicado: en Linux, la memoria máxima es megabytes; en macOS está en kilobytes. Para obtener el valor de %M, zsh llama getrusage()y luego usaru_maxrss / 1024. pero en Linux ru_maxrssestá en kilobytes y en Mac está en bytes. Ver man getrusageen ambas plataformas.)

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:                3 MB
page faults from disk:     0
other page faults:         337

Respuesta2

tiempo GNUpuede reportar un poco más de información que la versión integrada en Bash; Úselo command timeen lugar de simplemente timeinvocarlo, y consulte la página de manual o la información para obtener más detalles.

Respuesta3

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 sólo funciona para /usr/bin/timeaquello que a menudo no se llama de forma predeterminada.

Desde la página de manual:

K Uso de memoria total promedio (datos+pila+texto) del proceso, en Kilobytes.

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

Respuesta4

Puedes usar /usr/bin/timecual es diferente de time.

Úselo -vy podrá tener lo que desea sin ninguna instalación adicional.

Ejemplo:

$ /usr/bin/time -v cat xxx.txt > /dev/null
    Command being timed: "cat xxx.txt"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 100%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 2024
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 121
    Voluntary context switches: 0
    Involuntary context switches: 0
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

información relacionada