wake-up-neo.com

einfachstes Tool zum Messen von C-Programm-Cache-Treffern und CPU-Zeiten unter Linux?

Ich schreibe ein kleines Programm in C und möchte seine Leistung messen.

Ich möchte sehen, wie viel Zeit es im Prozessor laufen lässt und wie viele Cache-Treffer + Fehler es gemacht hat. Informationen zu Kontextwechseln und Speichernutzung wären auch nett zu haben.

Die Ausführung des Programms dauert weniger als eine Sekunde.

Ich mag die Informationen von/proc/[pid]/stat, aber ich weiß nicht, wie ich sie sehen soll, nachdem das Programm gestorben ist/getötet wurde.

Irgendwelche Ideen?

BEARBEITEN: Ich denke, Valgrind fügt eine Menge Overhead hinzu. Deshalb wollte ich ein einfaches Tool wie/proc/[pid]/stat, das immer da ist.

49
jperelli

Verwenden Sie perf :

perf stat ./yourapp

Weitere Informationen finden Sie im Kernel Wiki Perf Tutorial . Hierbei werden die Hardware-Leistungsindikatoren Ihrer CPU verwendet, sodass der Overhead sehr gering ist.

Beispiel aus dem Wiki:

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

        5,099 cache-misses             #      0.005 M/sec (scaled from 66.58%)
      235,384 cache-references         #      0.246 M/sec (scaled from 66.56%)
    9,281,660 branch-misses            #      3.858 %     (scaled from 33.50%)
  240,609,766 branches                 #    251.559 M/sec (scaled from 33.66%)
1,403,561,257 instructions             #      0.679 IPC   (scaled from 50.23%)
2,066,201,729 cycles                   #   2160.227 M/sec (scaled from 66.67%)
          217 page-faults              #      0.000 M/sec
            3 CPU-migrations           #      0.000 M/sec
           83 context-switches         #      0.000 M/sec
   956.474238 task-clock-msecs         #      0.999 CPUs

   0.957617512  seconds time elapsed

Es muss kein Kernel-Modul manuell geladen werden, auf einem modernen Debian-System (mit dem Linux-Basispaket) sollte es nur funktionieren. Mit der Kombination 'perf record -a'/'perf report' können Sie auch vollständige Systemprofile erstellen. Alle Anwendungen oder Bibliotheken mit Debugsymbolen werden mit Details im Bericht angezeigt. Zur Visualisierung scheinen Flammengraphen gut zu funktionieren.

86
maxy

Sie können auch verwenden

/usr/bin/time -v YourProgram.exe

Es zeigt Ihnen alle diese Informationen:

/usr/bin/time -v ls
    Command being timed: "ls"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 60%
    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): 4080
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 314
    Voluntary context switches: 1
    Involuntary context switches: 1
    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

Sie können auch das Flag -f verwenden, um die Ausgabe Ihren Anforderungen entsprechend zu formatieren.

Bitte stellen Sie sicher, dass Sie dieses Programm mit dem vollständigen Pfad aufrufen. Andernfalls wird der Befehl 'time' aufgerufen und das ist nicht das, was Sie brauchen ...

Hoffe das hilft!

11
Javi Ortiz

Das beste Werkzeug für Sie heißt valgrind. Es ist in der Lage, Speicherprofile zu erstellen, Call-Graphen zu erstellen und vieles mehr.

Sudo apt get install valgrind
valgrind ./yourapp

Um die Ausführungszeit Ihres Programms zu ermitteln, können Sie jedoch das Dienstprogramm time(8) linux verwenden.

time ./yourapp
8
iehrlich