outil le plus simple pour mesurer le cache du programme C hit / miss et le temps cpu sous linux?

J'écris un petit programme en C, et je veux mesurer ses performances.

Je veux voir combien de temps le faire exécuter par le processeur et combien de cache hit+ennuie a fait. Des informations sur les commutateurs de contexte et l'utilisation de la mémoire seraient également utiles.

Le programme prend moins d'une seconde à exécuter.

J'aime les informations de / proc/[pid] / stat, mais je ne sais pas comment les voir après la mort/la mort du programme.

Tout des idées?

EDIT: je pense que Valgrind ajoute beaucoup de frais généraux. C'est pourquoi je voulais un outil simple, comme /proc/[pid]/stat, qui est toujours là.

45
demandé sur jschoi 2012-04-10 06:47:56

3 réponses

Utiliser perf:

perf stat ./yourapp

Voir le tutorielkernel wiki perf pour plus de détails. Cela utilise les compteurs de performance matérielle de votre CPU, de sorte que la surcharge est très faible.

Exemple du 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

Pas besoin de charger un module noyau manuellement, sur un système debian moderne (avec le paquet linux-base) ça devrait juste fonctionner. Avec la combinaison' perf record-a ' / 'perf report', vous pouvez également effectuer un profilage complet du système. Toute application ou bibliothèque ayant un débogage les symboles apparaîtront avec des détails dans le rapport. Pour la visualisation les graphiques de flamme semblent bien fonctionner.

76
répondu maxy 2016-02-17 14:38:06

Vous pouvez également utiliser

/usr/bin/time -v YourProgram.exe

Il vous montrera toutes ces informations:

/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

Vous pouvez également utiliser l'indicateur-f pour formater la sortie en fonction de vos besoins.

Assurez-vous D'appeler ce programme en utilisant son chemin complet, sinon il appellera la commande 'time' et ce n'est pas ce dont vous avez besoin...

Espérons que cela aide!

12
répondu Javi Ortiz 2013-02-22 13:36:34

Le meilleur outil pour vous est appelé valgrind. Il est capable de profiler la mémoire, de créer des graphiques d'appel et bien plus encore.

sudo apt get install valgrind
valgrind ./yourapp

Cependant, pour obtenir l'heure d'exécution de votre programme, vous pouvez utiliser l'utilitaire time(8) linux.

time ./yourapp
8
répondu iehrlich 2012-04-11 19:45:58