Esiste un comando come il tempo, ma per l'utilizzo della memoria?


31

C'è qualche comando simile time, ma che riporta più statistiche? Sarebbe bello se potessi fare qualcosa del tipo:

$ statistics some_command
time:
    real    0m3.002s
    user    0m0.000s
    sys     0m0.000s
memory:
    min     41K
    peak    2.5M
    mean    1.1M
. . .

Se potesse andare oltre, sarebbe fantastico. In questo momento, per il debug, finisco per guardare attentamente top(in realtà glances), o per spargere le dichiarazioni attraverso il mio codice.

Se ci fosse qualcosa a cui potrei passare un comando, sarebbe fantastico.

MODIFICARE

Potrei aver trovato una soluzione: perfnel pacchetto linux-toolse linux-tools-commonsu 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

( La pagina che ha aiutato. )


3
Non ci sono statistiche di memoria nei perfrisultati.
BatchyX,

"come il tempo ma per la memoria" non ha davvero senso. Cosa vuoi sapere esattamente ? La memoria non è una misura.
Der Hochstapler,

1
Stai cercando di controllare un'applicazione che stai facendo? In tal caso, in quale lingua?
dset0x

Risposte:


26

zshha un timecomando integrato più potente di quello che bashha e la zshversione può riportare statistiche di memoria.

Anche se non usi regolarmente zshcome shell quotidiana, puoi semplicemente eseguirlo quando devi raccogliere questo tipo di statistiche.

Impostare la TIMEFMTvariabile di ambiente per indicare l'output desiderato. Ecco cosa ho nel mio .zshrcfile (forse un po 'troppo elaborato, ma mi piace):

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'

Uscita campione:

% 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

La tua risposta mi ha aiutato MOLTO ma ho una domanda: la "memoria massima" è in MB? Credo che sia KB o addirittura B.
Andres,

Sono contento che abbia aiutato, @Andres. Nei miei test, la "memoria massima" è in MB, ma puoi provarla tu stesso compilando gist.github.com/mmorearty/fa34c0f29abe454fd14b ed eseguendolo in zsh con es time malloc-bytes 10000000. Questo mallocerà 10 megabyte, quindi provalo e vedi cosa riporta zsh.
Mike Morearty,

Secondo i documenti zsh %M è la memoria massima in megabyte.
gerrard00,

%Mrapporti in kilobyte
Antti Haapala

16

Il tempo GNU può riportare un po 'più di informazioni rispetto alla versione integrata in Bash; usa command timepiuttosto che solo timeper invocarlo, e vedi la pagina man o le informazioni per i dettagli.


2
Oppure chiama/usr/bin/time -v ./my_command.sh
ostrokach il

2

Sulla base della risposta di Richard, è possibile creare un alias per utilizzare il tempo GNU e fornire informazioni sulla memoria media e massima:

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

o regola il tuo ambiente:

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

Ma tieni presente che questo funziona solo per il /usr/bin/timequale spesso non viene chiamato per impostazione predefinita.

Dalla pagina man:

K Utilizzo medio totale della memoria (dati + stack + testo) del processo, in Kilobyte.

M Dimensione massima residente impostata del processo durante il suo ciclo di vita, in Kilobyte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.