Analisi delle prestazioni dei programmi C ++ [chiuso]

1

Come posso misurare le prestazioni dei miei programmi C ++ usando C ++?

Le metriche specifiche che voglio misurare sono:

  • Memoria utilizzata ( spazio )
  • Durata presa ( tempo )
posta A T 14.04.2012 - 08:53
fonte

7 risposte

5

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

Link ai dati

La cosa grandiosa di questo è che ha tutte le funzioni del sistema tracciate in modo da avere una visione accurata di quale funzione guardare.

    
risposta data 14.04.2012 - 18:22
fonte
4

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.

    
risposta data 14.04.2012 - 16:32
fonte
2

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.

    
risposta data 14.04.2012 - 09:06
fonte
2

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.

    
risposta data 14.04.2012 - 09:12
fonte
2

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 .

    
risposta data 14.04.2012 - 15:10
fonte
2

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.

    
risposta data 14.04.2012 - 09:37
fonte
1

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.

    
risposta data 14.04.2012 - 16:58
fonte

Leggi altre domande sui tag