2008-09-16 17 views
7

Non è raro che io abbia un programma le cui prestazioni dipendono solo da poche funzioni e voglio essere in grado di misurare la velocità di un singolo loop o di un segmento di codice fino alla precisione a un solo clock in modo da sapere se le mie modifiche stanno effettivamente migliorando prestazioni o se mi sto solo innamorando del placebo del codice "ottimizzato".Qual è il tuo strumento di profilazione di basso livello preferito?

Personalmente mi trovo a utilizzare ffmpeg's "bench.h", un set di macro C che utilizzano rdtsc per misurare l'ora del clock e compensa automaticamente gli switch di contesto e simili. Certo, questo approccio ha le sue debolezze; quali altri metodi di profiling di basso livello piacciono agli utenti di StackOverflow?

risposta

2

Non eseguo la programmazione di basso livello ora, ma se l'avessi fatto, darei un'occhiata a dtrace; da quello che ho letto sembra estremamente interessante. Per gli utenti di OS X c'è anche shark.

0

Il problema principale è che quando si "compila" il benchmarking è possibile modificare i risultati (in base al come e quando dell'implementazione). E con quelle cose di basso livello probabilmente sei molto influenzato dalle ottimizzazioni del tuo compilatore.

Ma personalmente su Linux Ho un debole per oprofile (oprofile) questo è un ampio sistema di profiler che è incorporato in un modulo del kernel e periodicamente tracce dove l'applicazione è passare il tempo. Quindi questo profila il tuo intero sistema, non solo una sola applicazione. Ma potrebbe essere che non ti sta dando abbastanza granularità.

0

Si consiglia di non strumentare il codice per il profilo. La migliore risposta che posso dare sarebbe quella di usare PTU (Performance Tuning Utility) da Intel, può essere trovato qui:

Questa utility è la diretta discendente di VTune e fornisce il miglior profiler disponibile disponibile. Sarai in grado di tenere traccia di dove la CPU sta spendendo o sprecando tempo (con l'aiuto degli eventi hardware disponibili), e questo senza rallentamento della tua applicazione o perturbazione del profilo.

1

valgrind è già stato menzionato, ma è particolarmente utile con lo strumento callgrind:

$ valgrind --tool=callgrind your_program 

quindi è possibile utilizzare KCacheGrind per visualizzare i dati.

0

Per Linux: Google Perftools

  • Più veloce di valgrind (ancora, non così a grana fine)
  • non ha bisogno di strumentazione codice
  • output grafico Nizza (-> kcachegrind)
  • fa profiling della memoria, cpu-profiling, leak-checking
0

OK, stai descrivendo un caldo -spot situazione - un ciclo stretto che occupa una grande frazione di tempo e non contiene chiamate di funzione.

Si desidera sapere se le modifiche apportate stanno avendo alcun effetto.

Ecco cosa farei:

  • Per vedere cosa cambiare per renderlo più veloce, due metodi, osso-semplice:

1) Single-passo attraverso il ciclo interno , per vedere esattamente cosa sta facendo e perché. Le probabilità sono piuttosto buone Vedrò alcune cose che potrebbero essere fatte meglio.

e/o

2) farlo funzionare in un grande anello esterno, e quindi interrompere manualmente. Fallo più volte Le istruzioni/dichiarazioni che rappresentano la maggior parte del tempo appariranno in questi campioni approssimativamente in proporzione al loro costo.

  • di dire se ho fatto alcuna differenza, un'altra tecnica osso semplice:

eseguirlo un miliardo di volte in un ciclo esterno e contare i secondi. Questo indica quanti nanosecondi impiegano il ciclo interno.