¿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: perf
en el paquete linux-tools
y linux-tools-common
en 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
Respuesta1
zsh
tiene un comando incorporado más potente time
que bash
el que tiene y la zsh
versión puede informar estadísticas de memoria.
Incluso si no lo utiliza regularmente zsh
como shell diario, puede ejecutarlo cuando necesite recopilar este tipo de estadísticas.
Configure la TIMEFMT
variable de entorno para indicar la salida que desea. Esto es lo que tengo en mi .zshrc
archivo (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_maxrss
está en kilobytes y en Mac está en bytes. Ver man getrusage
en 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 time
en lugar de simplemente time
invocarlo, 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/time
aquello 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/time
cual es diferente de time
.
Úselo -v
y 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