web-dev-qa-db-fra.com

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

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

Je veux voir combien de temps cela fonctionne-t-il dans le processeur et combien de hit + misses de cache a-t-il fait. Les informations sur les changements de contexte et l'utilisation de la mémoire seraient bien aussi.

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

J'aime les informations de/proc/[pid]/stat, mais je ne sais pas comment les voir après que le programme soit mort/tué.

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à.

49
jperelli

Utilisez perf :

perf stat ./yourapp

Voir le tutoriel de perfectionnement du wiki du noya pour plus de détails. Cela utilise les compteurs de performances matérielles 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 du noyau manuellement, sur un système Debian moderne (avec le paquet linux-base) il devrait simplement fonctionner. Avec le combo "perf record -a"/"perf report", vous pouvez également effectuer un profilage complet du système. Toute application ou bibliothèque comportant des symboles de débogage apparaîtra avec des détails dans le rapport. Pour la visualisation graphiques de flamme semble bien fonctionner.

86
maxy

Vous pouvez aussi 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.

S'il vous plaît, 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 ...

J'espère que cela t'aides!

11
Javi Ortiz

Le meilleur outil pour vous s'appelle valgrind. Il est capable de profiler la mémoire, de construire un graphique 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
iehrlich