Есть ли какая-нибудь команда, похожая на time, но для использования памяти?

Есть ли какая-нибудь команда, похожая на time, но для использования памяти?

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

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

решение1

zshимеет более мощную встроенную timeкоманду, чем bashу , и zshверсия может сообщать статистику памяти.

Даже если вы не используете его zshв качестве повседневной оболочки, вы можете просто запустить его, когда вам нужно собрать такую ​​статистику.

Установите TIMEFMTпеременную окружения, чтобы указать желаемый вывод. Вот что у меня в .zshrcфайле (возможно, немного слишком замысловато, но мне нравится):

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'

(Сложная деталь: в Linux максимальный объем памяти измеряется в мегабайтах; в macOS — в килобайтах. Чтобы получить значение %M, zsh вызывает getrusage(), а затем используетru_maxrss / 1024. но на Linux ru_maxrssэто килобайты, а на Mac это байты. Смотрите man getrusageна обеих платформах.)

Пример вывода:

% 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

решение2

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

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

решение4

Вы можете использовать /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

Связанный контент