2010-02-20 11 views
7

So che posso profilare il mio codice con gprof e kprof su Linux. Esiste un'alternativa comparabile a queste applicazioni su Windows?Codice di profiling C su Windows quando si utilizza Eclipse

+1

Quale compilatore stai usando su Windows? –

+3

È possibile utilizzare gprof su Windows con la porta MinGW del compilatore GCC. –

risposta

3

software commerciale:

  • razionale Quantificare (costoso, lento, ma molto dettagliato)
  • AQTime (meno costoso, meno lento, un po 'dettagliata)

Software libero:

Queste alternative commerciali modificare il codice compilato da 'strumentazione' (istruzioni aggiungendo) ad esso ed eseguire la sincronizzazione withing le istruzioni aggiunte. Ciò significa che fanno rallentare seriamente la tua applicazione.

Queste alternative gratuite utilizzano il campionamento, ovvero sono meno dettagliate, ma molto veloci. In pratica ho scoperto che soprattutto Very Sleepy è molto buono per dare una rapida occhiata ai problemi di prestazioni nella tua applicazione.

+0

Ho provato sia Very Sleepy che Luke StackWalker, ma non sono in grado di dirmi nulla. Non sembrano avere accesso al mio codice sorgente. gprof tuttavia funziona bene. Come mai? Mi piacciono molto i profiler basati su GUI, ma non funzionano. – Pieter

+0

Questo errore è stato prodotto da Luca StackWalker: 'ERRORE: SymGetModuleInfo64, GetLastError: 1114 (Indirizzo: 7C90E514)' – Pieter

+0

Ho aperto una domanda separata per questo problema qui: http://stackoverflow.com/questions/2302596/luke- stackwalker-returns-error-when-running-gprof-works-fine – Pieter

0

Sì, è possibile profilo codice with Visual Studio

+1

Sono un utente Eclipse, quindi non è un'opzione per me. – Pieter

+0

@Pieter: specificare questa importante clausola nella * domanda * –

+2

In ogni caso, le edizioni standard ed Express di Visual Studio non includono un profiler. Con Pro, c'è un semplice profiler (da linea di comando) che credo sia un download separato e non è facile da usare. Ciò che Microsoft vuole è che le persone (ricche) comprino Team Suite. – Steve314

3

C'è una porta MinGW di gprof che funziona più o meno come la variante di Linux. È possibile ottenere un intero MinGW installation (penso che gprof sia incluso ma non sicuro) o ottenere gprof dallo MinGW binutils package.

Per Eclipse, c'è TPTP ma non supporta la profilatura C/C++ per quanto ne so.

0

Qual è il motivo della profilazione? Vuoi a) misurare i tempi e ottenere un grafico delle chiamate, oppure b) trovare le cose da modificare per rendere il codice più veloce? (Questi non sono gli stessi.)

Se (b) è possibile utilizzare this trick, utilizzando il pulsante Pausa in Eclipse.


Aggiunto: Forse sarebbe utile a trasmettere una certa esperienza di ciò che i problemi di prestazioni sono in realtà piace, e dove ci si può aspettare di trovare loro. Ecco alcuni esempi semplici:

  • Un inserzione (ordine n^2) dove gli articoli che sono stati scelti sono stringhe, e sono confrontati da una funzione di stringa-confrontare. Dov'è il punto caldo? in stringa-confronta. Dov'è il problema? Nell'ordine in cui viene chiamato il confronto delle stringhe. Se n = 10 non è un problema, ma se n = 1000, all'improvviso ci vuole molto tempo. Il punto in cui viene chiamato string-compare è "cold", ma è qui che si trova il problema. Un piccolo numero di campioni dello stack di chiamata lo individuano con certezza.

  • Un'app che carica i plug-in richiede molto tempo per l'avvio. Un profiler dice che praticamente tutto in esso è "freddo". Qualcosa che misura il tempo di I/O dice che è quasi tutto il tempo di I/O, che sembra come ci si potrebbe aspettare, quindi potrebbe sembrare senza speranza.Tuttavia, i campioni di stack mostrano una grande percentuale di tempo trascorso con lo stack di circa 20 livelli nel processo di lettura della parte di risorse delle DLL di plugin allo scopo di convertire le costanti di stringa nella lingua locale. Indagando ulteriormente, si scopre che la maggior parte delle stringhe in fase di traduzione non sono il tipo che in realtà ha bisogno della traduzione. Sono stati messi in "caso" potrebbero aver bisogno di una traduzione e non sono mai stati pensati come qualcosa che potrebbe causare un problema di prestazioni. Risolvendo questo problema si ottengono notevoli risparmi di tempo.

Quindi è comune a pensare in termini di "punti caldi" e "colli di bottiglia", ma la maggior parte dei programmi, soprattutto quelli più grandi, tendono ad avere problemi di prestazioni in forma di chiamate di funzione che richiede un lavoro che non lo fa davvero bisogno di essere fatto. Fortunatamente si visualizzano sullo stack delle chiamate durante il tempo che stanno spendendo.

+0

Sono interessato alla creazione di profili per vedere quali parti del mio codice impiegano più tempo a essere eseguite in modo da poter scoprire eventuali inefficienze. – Pieter

+0

@Pieter: trovare le inefficienze è (b). Sto cercando di spargere la voce su questo. Ecco un altro esempio: http://stackoverflow.com/questions/2308026/which-has-been-the-most-reliable-fastest-windows-c-profiler-that-you-have-used/2311117#2311117 –

+0

Sembra complicato per un principiante C come me. La mia applicazione di profilazione ideale dovrebbe essere in grado di posare una mappa di calore sul mio codice per vedere quali comandi impiegano più tempo per l'esecuzione. Qualche codice dovrebbe impiegare più tempo di elaborazione, lo so, ma ci sono molti casi in cui questo potrebbe aiutare a rilevare le inefficienze di cui sopra. – Pieter

Problemi correlati