Existe-t-il une commande comme le temps, mais pour l'utilisation de la mémoire?

34

Existe-t-il une commande similaire time, mais qui rapporte plus de statistiques? Ce serait génial si je pouvais faire quelque chose comme:

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

Si cela pouvait aller encore plus loin, ce serait formidable. En ce moment, pour le débogage, je finis par regarder attentivement top(en fait glances) ou parsemer des instructions tout au long de mon code.

S'il y avait quelque chose auquel je pouvais passer une commande, ce serait fantastique.

MODIFIER

J'aurais peut-être trouvé une solution: perfdans le package linux-toolset linux-tools-commonsur 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 page qui a aidé. )

Peter
la source
3
Il n'y a pas de statistiques de mémoire dans vos perfrésultats.
BatchyX
"comme le temps mais pour la mémoire" n'a pas vraiment de sens. Qu'est - ce exactement voulez - vous savoir? La mémoire n'est pas une mesure.
Der Hochstapler
1
Vous souhaitez auditer une application que vous faites? Si oui, dans quelle langue?
dset0x

Réponses:

28

zsha une timecommande intégrée plus puissante que la bashnôtre, et la zshversion peut rapporter des statistiques de mémoire.

Même si vous ne l'utilisez pas régulièrement zshcomme shell au jour le jour, vous pouvez simplement l'exécuter lorsque vous avez besoin de collecter ce type de statistiques.

Définissez la TIMEFMTvariable d'environnement pour indiquer la sortie souhaitée. Voici ce que j'ai dans mon .zshrcdossier (peut-être un peu trop fantaisiste, mais j'aime ça):

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'

Exemple de sortie:

% 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
Mike Morearty
la source
Votre réponse m'a beaucoup aidé, mais j'ai une question: la «mémoire max» est-elle en Mo? Je crois que c'est KB ou même B.
Andres
Heureux que cela ait aidé, @Andres. Dans mes tests, «max memory» est en Mo, mais vous pouvez le tester vous-même en compilant gist.github.com/mmorearty/fa34c0f29abe454fd14b et en l'exécutant en zsh avec par exemple time malloc-bytes 10000000. Cela va malloc 10 mégaoctets, alors essayez-le et voyez ce que rapporte zsh.
Mike Morearty du
Selon les documents zsh, %M la mémoire maximale est en mégaoctets.
gerrard00
%Mrapports en kilo
Antti Haapala
16

Le temps GNU peut rapporter un peu plus d'informations que la version intégrée à Bash; utilisez command timeplutôt que de simplement l' timeinvoquer, et consultez la page de manuel ou les informations pour plus de détails.

Richard Kettlewell
la source
2
Ou appelez/usr/bin/time -v ./my_command.sh
ostrokach
3

Sur la base de la réponse de Richard, vous pouvez créer un alias pour utiliser le temps GNU et fournir des informations sur la mémoire moyenne et maximale:

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

ou ajustez votre environnement:

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

Mais sachez que cela ne fonctionne que pour /usr/bin/timelequel n'est souvent pas appelé par défaut.

Depuis la page de manuel:

K Utilisation totale moyenne (données + pile + texte) de la mémoire du processus, en kilo-octets.

M Taille maximale définie par le résident du processus pendant sa durée de vie, en kilo-octets.

Dej
la source