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

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

Gibt es einen Befehl wie time, der mehr Statistiken meldet? Es wäre toll, wenn ich so etwas tun könnte:

$ 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 muss ich beim Debuggen entweder intensiv auf top(eigentlich glances) starren oder Anweisungen überall in meinen Code einstreuen.

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

BEARBEITEN

Ich habe möglicherweise eine Lösung gefunden: perfim Paket linux-toolsund linux-tools-commonauf 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.)

Antwort1

zshverfügt über einen leistungsfähigeren integrierten timeBefehl als bashund die zshVersion kann Speicherstatistiken melden.

Auch wenn Sie es nicht regelmäßig zshals Ihre alltägliche Shell verwenden, können Sie es einfach ausführen, wenn Sie diese Art von Statistiken erfassen müssen.

Legen Sie die TIMEFMTUmgebungsvariable fest, um die gewünschte Ausgabe anzugeben. Folgendes habe ich in meiner .zshrcDatei (vielleicht ein bisschen zu ausgefallen, 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 beträgt der maximale Speicher Megabyte, unter macOS Kilobyte. Um den Wert für zu erhalten %M, ruft zsh auf getrusage()und verwendet dannru_maxrss / 1024. aber unter Linux ru_maxrssin Kilobyte und auf dem Mac in Byte. Siehe man getrusageauf 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

Antwort2

GNU-Zeitkann etwas mehr Informationen melden als die in Bash integrierte Version; verwenden Sie es, command timeanstatt es nur timeaufzurufen. Weitere Einzelheiten finden Sie auf der Manpage oder in den Informationen.

Antwort3

Basierend auf Richards Antwort können Sie einen Alias ​​erstellen, um die GNU-Zeit 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 funktioniert, /usr/bin/timewenn es häufig nicht standardmäßig aufgerufen wird.

Aus der Manpage:

K Durchschnittliche gesamte Speichernutzung (Daten + Stapel + Text) des Prozesses in Kilobyte.

M Maximale Resident Set-Größe des Prozesses während seiner Lebensdauer in Kilobyte.

Antwort4

Sie können etwas verwenden /usr/bin/time, das sich von unterscheidet time.

Verwenden Sie es -v, und Sie erhalten möglicherweise, was Sie möchten, ohne dass eine zusätzliche Installation erforderlich ist.

Beispiel:

$ /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

verwandte Informationen