2009-08-04 2 views
6

Utilizziamo g ++ 4.2.4 e sto cercando di rintracciare alcuni problemi di prestazioni nel mio codice.Che cos'è la funzione __tcf_0? (Visto quando si usano gprof e g ++)

Io corro gprof per generare il profilo, e sto ottenendo il seguente "stranezza", in quanto la funzione più costoso è __tcf_0:

Each sample counts as 0.01 seconds. 
% cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
40.00  0.04  0.04  1 40.00 95.00 __tcf_0 

appare quindi questa funzione per le chiamate maggior parte del mio utente funzioni (cioè è quella chiamata dal principale). La spiegazione più vicina che ho trovato per questo era here, ma quel collegamento si riferisce ad oggetti statici e atexit, e non penso che ciò si applichi nel mio caso.

Se è utile, sto usando Boost (program_options e fusion) e le librerie HDF5.

UPDATE:

Il comando che uso quando costruzione è:

g++ -Wreturn-type -Wunused -Winline -pg -DLINUX -DHAS_SETENV \ 
    -DFUSION_MAX_MAP_SIZE=15 -DFUSION_MAX_VECTOR_SIZE=15 -g -O0 \ 
    --param large-function-growth=300 --param inline-unit-growth=200 

risposta

3

__tcf_0 sembra infatti essere una funzione che chiama distruttore di oggetti statici e che è registrato per ogni oggetti statici, a essere chiamato all'uscita (dando per scontato quello che viene detto su this page)

Ora, il risultato del tuo gprof è piuttosto strano, poiché la funzione che richiede la maggior parte del tempo è solo tak es 0,04 secondi, il che significa che l'intero programma impiega 0,1 s per essere eseguito. Se non sbaglio, la mia ipotesi è che non hai il profilo correttamente. Hai compilato il tuo codice con il profilo abilitato?

+0

Ho aggiunto il comando di build che usiamo per la domanda. Abbiamo un sistema di compilazione abbastanza flessibile, e questo sta utilizzando uno speciale "gprof" per la configurazione che ho usato con successo in passato. Quindi in linea di principio penso * Ho tutte le impostazioni necessarie. –

+0

Entrambe le risposte sono corrette, ma la ripetizione è probabilmente più utile per te. –

5

g ++ genera funzioni con questo nome. Chiamano il distruttore di oggetti statici e sono registrati con atexit() quando viene chiamato il costruttore.