Gibt es einen Befehl wie time, aber für die Speichernutzung?

Gibt es einen Befehl wie time, aber das meldet mehr Statistiken? Es wäre großartig, wenn ich etwas tun könnte wie:

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

Wenn es noch weiter gehen könnte, wäre das großartig. Im Moment starre ich zum Debuggen entweder aufmerksam auf top (eigentlich glances) oder streue Anweisungen durch meinen gesamten Code.

Wenn es etwas gäbe, an das ich einen Befehl übergeben könnte, wäre das fantastisch.

BEARBEITEN

Ich könnte ein lösung: perf im Paket linux-tools und linux-tools-common unter 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

(Die Seite, die geholfen hat.)

Author: Peter, 2012-09-28

3 answers

zsh verfügt über einen leistungsfähigeren integrierten Befehl time als bash, und die Version zsh kann Speicherstatistiken melden.

Selbst wenn Sie zsh nicht regelmäßig als tägliche Shell verwenden, können Sie es einfach ausführen, wenn Sie diese Art von Statistiken sammeln müssen.

Legen Sie die Umgebungsvariable TIMEFMT fest, um die gewünschte Ausgabe anzugeben. Hier ist, was ich in meiner .zshrc Datei habe (vielleicht ein bisschen zu schick, aber ich mag es):

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'

(Ein kompliziertes Detail: Unter Linux ist der maximale Speicher Megabyte; auf macOS ist es in Kilobyte. Um den Wert für %M abzurufen, ruft zsh getrusage() auf und verwendet dannru_maxrss / 1024. aber unter Linux ist ru_maxrss in Kilobyte und auf dem Mac in Bytes. Siehe man getrusage, auf beiden Plattformen.)

Beispielausgabe:

% 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
 36
Author: Mike Morearty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-07-10 02:43:09

GNU time kann etwas mehr Informationen melden als die in Bash integrierte Version; Verwenden Sie command time anstatt nur time, um es aufzurufen, und sehen Sie sich die Manpage oder Informationen für Details an.

 18
Author: Richard Kettlewell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-09-29 10:30:55

Basierend auf Richards Antwort können Sie einen Alias erstellen, um GNU time zu verwenden und durchschnittliche und maximale Speicherinformationen bereitzustellen:

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

Oder passen Sie Ihre Umgebung an:

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

Beachten Sie jedoch, dass dies nur für /usr/bin/time funktioniert, das häufig nicht standardmäßig aufgerufen wird.

Von der Manpage:

K Durchschnittliche Gesamtspeichernutzung (Daten+Stapel+Text) des Prozesses, in Kilobyte.

M Maximale resident set größe des prozesses während seiner Lebenszeit, in Kilobyte.

 5
Author: Dej,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-12 13:48:39