41

Sto scrivendo un piccolo programma in C, e voglio misurare le sue prestazioni.lo strumento più semplice per misurare la cache del programma C in modalità hit/miss e in cpu in linux?

Voglio vedere quanto tempo viene eseguito nel processore e quanti cache ha fatto hit + miss. Anche le informazioni sugli interruttori di contesto e sull'uso della memoria sarebbero piacevoli.

Il programma richiede meno di un secondo per l'esecuzione.

Mi piace l'informazione di/proc/[pid]/stat, ma non so come vederlo dopo che il programma è morto/è stato ucciso.

Qualche idea?

MODIFICA: Penso che Valgrind aggiunga un sacco di spese generali. Ecco perché volevo uno strumento semplice, come/proc/[pid]/stat, che è sempre lì.

+0

Stai cercando qualcosa di simile? http://software.intel.com/en-us/articles/intel-performance-counter-monitor/ – harold

risposta

66

Usa perf:

perf stat ./yourapp 

Vedere la kernel wiki perf tutorial per i dettagli. Questo utilizza i contatori delle prestazioni hardware della CPU, quindi l'overhead è molto piccolo.

Esempio dal 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 

Non c'è bisogno di caricare un modulo del kernel manualmente, su un moderno sistema Debian (con il pacchetto linux-base) dovrebbe funzionare. Con la combinazione 'perf record -a'/'perf report' puoi anche eseguire il profiling dell'intero sistema. Qualsiasi applicazione o libreria con simboli di debug verrà visualizzata con i dettagli nel report. Per la visualizzazione flame graphs sembra funzionare bene.

7

Lo strumento migliore per te è chiamato valgrind. È in grado di eseguire il profiling della memoria, la creazione di call-graph e molto altro.

sudo apt get install valgrind 
valgrind ./yourapp 

Tuttavia, per ottenere il tempo il vostro programma eseguito, è possibile utilizzare time(8) utility Linux.

time ./yourapp 
+0

può valgrind misurare la cache, o solo la memoria principale? – jperelli

+1

per quanto ne so, valgrind può misurare tutti i livelli di cache, almeno L1 e L2. – iehrlich

+3

C'è un modulo di Valgrind chiamato cachegrind che misura la cache. –

10

È inoltre possibile utilizzare

/usr/bin/time -v YourProgram.exe 

che vi mostrerà tutte queste informazioni:

/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 

È inoltre possibile utilizzare il flag -f per formattare l'output per soddisfare le vostre esigenze.

prega, assicurarsi di chiamare questo programma usando il suo percorso completo, otherway chiamerà il comando 'tempo' e che non è quello che ti serve ...

Spero che questo aiuti!

+7

È utile notare che '/ usr/bin/time! = Time'. In bash, 'time' è una parola chiave shell incorporata. – jperelli

+9

Ma dove manca la cache? –

+3

La risposta non ha nulla a che fare con le mancanze della cache. –