Есть ли команда, как время, но для использования памяти?
Есть ли какая-либо команда, как time
, но что сообщает больше статистики? Было бы здорово, если бы я мог сделать что-то вроде:
$ statistics some_command
time:
real 0m3.002s
user 0m0.000s
sys 0m0.000s
memory:
min 41K
peak 2.5M
mean 1.1M
. . .
Если бы это могло пойти еще дальше, это было бы здорово. Прямо сейчас, для отладки, я либо пристально смотрю на top
(на самом деле glances
), или разбрызгивать заявления по всему моему коду.
Если бы я мог передать команду, это было бы здорово.
РЕДАКТИРОВАТЬ
Я мог бы найти решение: perf
в упаковке linux-tools
а также linux-tools-common
на 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
4 ответа
zsh
имеет более мощный встроенный time
командовать чем bash
имеет, а zsh
версия может сообщать статистику памяти.
Даже если вы не используете регулярно zsh
как ваша повседневная оболочка, вы можете просто запустить ее, когда вам нужно собрать такую статистику.
Установить TIMEFMT
переменная окружения, чтобы указать желаемый результат. Вот что у меня в моем .zshrc
файл (возможно, немного слишком необычный, но мне это нравится):
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'
Пример вывода:
% 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
Время GNU может сообщить немного больше информации, чем версия, встроенная в Bash; использование command time
а не просто time
чтобы вызвать его, и посмотреть страницу руководства или информацию для деталей.
Основываясь на ответе Ричарда, вы можете создать псевдоним для использования времени GNU и предоставления средней и максимальной информации о памяти:
alias time="$(which time) -f '\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem'"
или настройте свою среду:
export TIME='\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem'
Но имейте в виду, что это работает только для /usr/bin/time
который часто не вызывается по умолчанию.
Со страницы руководства:
K Среднее суммарное (данные + стек + текст) использование памяти процессом, в килобайтах.
M Максимальный размер резидентного набора процесса в течение его срока службы, в килобайтах.
Вы можете использовать/usr/bin/time
который отличается отtime
.
Используйте его с-v
и вы можете получить то, что хотите, без какой-либо дополнительной установки.
Пример:
$ /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