Come posso misurare le prestazioni dei miei programmi C ++ usando C ++?
Le metriche specifiche che voglio misurare sono:
- Memoria utilizzata ( spazio )
- Durata presa ( tempo )
Per quanto riguarda il profilo delle cose, finché usi GNU, puoi usare gprof. Ti darà risultati come questo:
Ogni campione conta come 0,01 secondi.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
33.34 0.02 0.02 7208 0.00 0.00 open
16.67 0.03 0.01 244 0.04 0.12 offtime
16.67 0.04 0.01 8 1.25 1.25 memccpy
16.67 0.05 0.01 7 1.43 1.43 write
16.67 0.06 0.01 mcount
0.00 0.06 0.00 236 0.00 0.00 tzset
0.00 0.06 0.00 192 0.00 0.00 tolower
0.00 0.06 0.00 47 0.00 0.00 strlen
0.00 0.06 0.00 45 0.00 0.00 strchr
0.00 0.06 0.00 1 0.00 50.00 main
0.00 0.06 0.00 1 0.00 0.00 memcpy
0.00 0.06 0.00 1 0.00 10.11 print
0.00 0.06 0.00 1 0.00 0.00 profil
0.00 0.06 0.00 1 0.00 50.00 report
La cosa grandiosa di questo è che ha tutte le funzioni del sistema tracciate in modo da avere una visione accurata di quale funzione guardare.
Per la durata (tempo) vorrei anche usare un profiler. Tuttavia, se si desidera tenere traccia alcuni metodi in particolare, ho usato il trucco di definire un piccolo timer che avvia un timer nel costruttore e lo arresta nel distruttore. Quindi tutto ciò che devi fare è definire una variabile del timer locale all'inizio dei metodi che vuoi profilare, in questo modo:
MyClass::myMethod()
{
MyTimer timer("MyClass::myMethod");
...
}
Il distruttore della variabile timer registrerà il nome del metodo e la durata quando esci dal metodo.
Sì, l'utilizzo di un profiler è molto più pulito e non è necessario modificare il codice (anche se normalmente aggiungo le variabili del timer in una copia separata di il codice sorgente quindi non è necessaria alcuna pulizia in seguito) ma ho trovato questo metodo un'efficace alternativa all'utilizzo di un profiler se il codice che si desidera al profilo è molto localizzato.
Solo i miei 2 cent.
Sono d'accordo con Pubby che la profilazione utilizzando strumenti esterni sia migliore. Ecco alcuni suggerimenti:
Per ottenere una stima approssimativa del tempo impiegato da un eseguibile, utilizzerei uno strumento Linux come time
. Eseguendo il% eseguibile come% co_de:
time spam
Ti dà un feedback su quanto tempo ci è voluto. Potresti anche scrivere un piccolo script Python che fa questo alcune volte e calcola una media dei risultati. Vedi questo SO thread per alcuni suggerimenti su come misurare la memoria utilizzata da un'applicazione.
Ma questo dà solo una visione cumulativa del tuo programma. Molto più interessante è rompere questa analisi per diverse parti del tuo codice. Puoi farlo profilando il tuo codice, ad esempio utilizzando il profiler GNU % codice%. Questo ti presenterà una panoramica di quanto tempo è trascorso in quali parti del codice. Questo può darti un'idea di dove potresti dedicare più tempo all'ottimizzazione e dove le prestazioni del codice non sono molto importanti.
How can I measure the performance of my C++ programs using C++?
Questa è una pessima idea, perché ci sono già degli strumenti per farlo.
Su Linux, c'è time
per misurare il tempo usato dall'applicazione.
Anche su linux, puoi usare massif , che è un profilatore di heap.
Per misurare lo spazio, rimanderò ad altre risposte.
Per tempo, devo chiedere, stai misurando solo perché vuoi misurare, o perché vuoi che il programma impieghi meno tempo ?
Chiedo solo perché misurare il tempo, anche delle singole funzioni, non dice cosa dovresti correggere per farlo funzionare più velocemente. Potrebbe dirti dove non dovrebbe apparire (cioè funzioni con percentuali inclusive basse), ma questo non ti dice dove dovresti concentrarti. Per farlo, qui il metodo che uso .
Spazio: utilizza uno o più allocatori specializzati. In questo modo, puoi registrare il consumo di memoria esatto e gli eventi - locali per l'implementazione che ti interessa misurare. Ad esempio: std::vector<int,t_your_allocator>
. Globale new
/ delete
(solo per i test) e il nuovo posizionamento sono altri approcci.
Ora: Agner è un buon riferimento. link Agner Fog penetra in profondità nei costi e nelle misurazioni per iscritto: sono disponibili diversi libri (o manuali). Il sito ospita anche implementazioni che misurano i tempi di esecuzione.
Sono sicuro che devi avere un buon motivo per profilare il tuo programma C ++ usando un altro programma C ++. Se sei in Linux, ti suggerisco di esaminare i dettagli del filesystem / proc e di file come meminfo che il sistema operativo tiene traccia del tuo utilizzo della memoria di runtime.
Se hai voglia di esplorare strumenti che possono richiedere molto duro lavoro da sviluppare da solo ti suggerisco di esaminare Quantify, VTune, Valgrind ecc.
Leggi altre domande sui tag c++ performance time-tracking performance-tools