Gibt es einen Befehl wie time, außer für die Speichernutzung?

34

Gibt es einen Befehl wie time, der aber mehr Statistiken meldet? Es wäre toll, wenn ich etwas machen 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. Momentan ende ich beim Debuggen entweder damit, top(tatsächlich glances) genau hinzuschauen oder Anweisungen durch meinen Code zu streuen.

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

BEARBEITEN

Möglicherweise habe ich 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. )

Peter
quelle
3
Ihre perfErgebnisse enthalten keine Speicherstatistik .
BatchyX
"Wie die Zeit, aber für die Erinnerung" ist nicht wirklich sinnvoll. Was genau willst du wissen? Speicher ist keine Messung.
Der Hochstapler
1
Möchten Sie einen von Ihnen gestellten Antrag prüfen? Wenn ja, in welcher Sprache?
dset0x

Antworten:

28

zshhat einen leistungsstärkeren eingebauten timeBefehl als bash, und die zshVersion kann Speicherstatistiken melden.

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

Stellen Sie die TIMEFMTUmgebungsvariable so ein, dass sie die gewünschte Ausgabe angibt. Folgendes habe ich in meiner .zshrcAkte (vielleicht etwas zu ausgefallen, aber es gefällt mir):

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'

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:                668 MB
page faults from disk:     0
other page faults:         337
Mike Morearty
quelle
Ihre Antwort hat mir VIEL geholfen, aber ich habe eine Frage: Ist 'max memory' in MB? Ich glaube, es ist KB oder sogar B.
Andres
Ich bin froh, dass es geholfen hat, @Andres. In meinen Tests ist 'max memory' in MB, aber Sie können es selbst testen, indem Sie gist.github.com/mmorearty/fa34c0f29abe454fd14b kompilieren und es in zsh mit zb ausführentime malloc-bytes 10000000 . Das wird 10 Megabyte ausmachen, also probiere es aus und schau, was zsh meldet.
Mike Morearty
Laut zsh docs %M ist der maximale Arbeitsspeicher in Megabyte.
Gerrard00
%MBerichte in Kilobyte
Antti Haapala
16

GNU-Zeit kann ein bisschen mehr Informationen liefern als die in Bash integrierte Version. Verwenden Sie diese command timeOption nicht nur time, um sie aufzurufen, sondern lesen Sie die Manpage oder Informationen, um weitere Informationen zu erhalten.

Richard Kettlewell
quelle
2
Oder rufen Sie an/usr/bin/time -v ./my_command.sh
ostrokach
3

Basierend auf Richards Antwort können Sie einen Alias ​​für die Verwendung der GNU-Zeit erstellen und durchschnittliche und maximale Speicherinformationen bereitstellen:

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, wenn dies /usr/bin/timehäufig nicht standardmäßig aufgerufen wird.

Von der Manpage:

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

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

Dej
quelle