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

9296
Peter

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

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

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

3 ответа на вопрос

21
Mike Morearty

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 8 лет назад 0
Рад, что это помогло, @Andres. В моих тестах 'max memory' в мегабайтах, но вы можете проверить это самостоятельно, скомпилировав https://gist.github.com/mmorearty/fa34c0f29abe454fd14b и запустив его в zsh, например, `time malloc-bytes 10000000`. Это будет malloc 10 мегабайт, так что попробуйте и посмотрите, что сообщает zsh. Mike Morearty 8 лет назад 0
Согласно [zsh docs] (http://zsh.sourceforge.net/Doc/Release/Parameters.html) `% M` - это максимальный объем памяти в мегабайтах. gerrard00 7 лет назад 0
14
Richard Kettlewell

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

Или вызовите `/ usr / bin / time -v. / My_command.sh` ostrokach 6 лет назад 1
2
Dej

Based on Richard's answer, you can create an alias to use GNU time and provide average and maximum memory information:

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

or adjust your environment:

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

But be aware that this only works for /usr/bin/time which is often not called by default.

From the man page:

K Average total (data+stack+text) memory use of the process, in Kilobytes.

M Maximum resident set size of the process during its lifetime, in Kilobytes.