2009-08-04 9 views
6

Utilizamos g ++ 4.2.4 y estoy tratando de rastrear algunos problemas de rendimiento en mi código.¿Qué es la función __tcf_0? (Visto al usar gprof y g ++)

estoy corriendo gprof para generar el perfil, y yo estoy recibiendo el siguiente "extraño" en el que la función más caro es __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 

Esta función aparece a continuación, llama a la mayor parte del usuario funciones (es decir, es la que se llama desde main). La explicación más cercana que encontré para esto fue here, pero ese enlace se refiere a objetos estáticos y atexit, y no creo que esto se aplique en mi caso.

Si es útil, estoy usando Boost (program_options and fusion) y las bibliotecas HDF5.

ACTUALIZACIÓN:

El comando que uso cuando la construcción es:

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 

Respuesta

3

__tcf_0 parece de hecho ser una función que llama destructor de objetos estáticos y que está registrada para cada objetos estáticos, a ser llamado al salir (dando por hecho lo que se dice en this page)

Ahora, el resultado de su gprof es bastante extraño, ya que la función que toma la mayor parte del tiempo solo toma tak es 0.04 segundos, lo que significa que el programa completo tarda 0.1 s en ejecutarse. Si no me equivoco, supongo que no perfiló correctamente. ¿Compiló su código con perfil habilitado?

+0

He agregado el comando de compilación que usamos para la pregunta. Tenemos un sistema de compilación bastante flexible, y esto está utilizando una configuración especial de configuración "gprof" que he utilizado con éxito en el pasado. Entonces, en principio, * pienso * Tengo todos los ajustes que se necesitan. –

+0

Ambas respuestas son bastante correctas, pero el representante probablemente sea más útil para usted. –

5

g ++ genera funciones con este nombre. Llaman al destructor de objetos estáticos y se registran con atexit() cuando se llama al constructor.

Cuestiones relacionadas