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