2012-06-08 9 views
6

Ho un programma composto da diversi file .h e .c e molte funzioni. E ci sono funzioni che chiamano altre funzioni e così via. Ora, questo è in realtà un compito quindi so quanto tempo il programma deve raggiungere la fine.Strumenti per scoprire cosa sta rallentando un programma C?

Il problema è che il mio programma impiega troppo tempo rispetto ai tempi che mi vengono dati. È possibile scoprire quale funzione sta impiegando troppo tempo o quale parte del codice trattiene il programma?


Non ho fornito il codice qui perché è troppo lungo. So che nessuno può rispondere perché "il mio programma" è lento, ma sto parlando in generale! Esiste uno strumento che misura quanto tempo impiega ciascuna funzione o qualcosa di simile? Sto usando gcc e sono su Linux.

+5

Questo è senza risposta. Esiste un intero universo di cause alla radice e non ci hai nemmeno mostrato il codice. –

+11

Si dovrebbe esaminare [profiling] (https://en.wikipedia.org/wiki/Profiling_%28computer_programming% 29). Questo è esattamente il processo che risolverà il tuo problema. ('gprof' è un esempio di un profiler che è spesso preinstallato su sistemi Unix/Linux.) – huon

+3

Dovresti davvero analizzare il tuo codice come indicato da @dbaupp. Alcuni strumenti - valgrind = http://valgrind.org/, gprof = http: //www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html ... http: //oprofile.sourceforge. net/news/= OProfile. GProf è molto buono tra loro lo uso spesso. – verisimilitude

risposta

9

Dato che si utilizza Linux, probabilmente è già installato il profiler gprof. L'utilizzo più semplice di gprof consiste nel compilare l'opzione -pg (l'opzione -g è necessaria anche per ottenere un risultato informativo). per esempio.

> gcc -g -pg -o my_executable my_file.c 

Ora è possibile eseguire normalmente il programma. Poi si esegue

> gprof my_executable > profile.txt 

che sarà in uscita le informazioni di profilazione in profile.txt. Questi dati sembra un po 'come

Flat profile: 

Each sample counts as 0.01 seconds. 
    % 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 

[...] 

e si possono leggere alcuni dati su ciascuna funzione (ad esempio open è stato chiamato 7208 volte e sono stati spesi 0.02s eseguirlo.). Questi dati di esempio sono stati presi in prestito da this guide, che dovresti leggere in quanto fornisce molte più spiegazioni e descrive come manipolare la profilazione per ottenere profili come il profiling riga per riga.

+0

Grazie mille. Questo è perfetto! – MinaHany

+0

È probabile che i rapporti dei tempi di diverse funzioni cambieranno se non si compili con '-g'? – simon

+0

@simon, non penso che farà un'enorme differenza, ma non ne sono sicuro. – huon

1

Come suggerito da dbaupp sopra, gprof è un ottimo strumento per linux. Inoltre, se hai accesso a IBM Rational Quantify, puoi provarlo anche tu. È uno strumento commerciale, ma offre una buona visualizzazione grafica delle funzioni che richiedono più tempo e il flusso di chiamate, ecc.

+0

Holy ** $$$$ 7k ** per una licenza per utente singolo! ?? Ciò rende tutti i miei strumenti Microsoft a buon mercato ... –

+0

Sai cos'è anche divertente, è 7,7k € che converte in più di 9,6 mila dollari. –

Problemi correlati