Есть ли команда, как время, но для использования памяти?

34

Есть ли какая-либо команда, подобная 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

( Страница, которая помогла. )

Питер
источник
3
В ваших perfрезультатах нет статистики памяти .
BatchyX
«как время, но для памяти» не имеет смысла. Что именно вы хотите знать? Память это не измерение.
Der Hochstapler
1
Вы ищете для проверки приложения, которое вы делаете? Если да, на каком языке?
dset0x

Ответы:

28

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
Майк Морарти
источник
Ваш ответ мне очень помог, но у меня есть вопрос: «Максимальная память» в МБ? Я считаю, что это КБ или даже Б.
Андрес
Рад, что это помогло, @Andres. В моих тестах 'max memory' в мегабайтах, но вы можете проверить это самостоятельно, скомпилировав gist.github.com/mmorearty/fa34c0f29abe454fd14b и запустив его в zsh с помощью eg time malloc-bytes 10000000. Это будет malloc 10 мегабайт, так что попробуйте и посмотрите, что сообщает zsh.
Майк Морарти
По данным zsh docs %M это максимальный объем памяти в мегабайтах.
gerrard00
%Mотчеты в килобайтах
Антти Хаапала
16

Время GNU может сообщить немного больше информации, чем версия, встроенная в Bash; используйте command timeвместо того, чтобы просто timeвызывать его, и смотрите страницу руководства или информацию для деталей.

Ричард Кеттвелл
источник
2
Или позвони/usr/bin/time -v ./my_command.sh
острокач
3

Основываясь на ответе Ричарда, вы можете создать псевдоним для использования времени 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 Максимальный размер резидентного набора процесса в течение его срока службы, в килобайтах.

Дей
источник