PDA

Ver la versión completa : ¿Qué es mcount_internal?



Puck2099
16/05/2006, 20:59
Hola,

He estado haciendo profiling de un proyecto para priorizar las optimizaciones allí donde sea más necesario y he obtenido unos resultados tal que así:



Cada muestra cuenta como 0.01 seconds.
% cumulativo sí mismo sí mismo total
tiemp seconds seconds llamadas s/llama s/llama nombre
46.11 396.45 396.45 mcount_internal
10.79 489.25 92.80 567138795 0.00 0.00 ReadMem
5.52 536.72 47.47 264672 0.00 0.00 RefreshLineColorHorz
4.63 576.54 39.82 11693760 0.00 0.00 nec_execute
4.23 612.95 36.41 32019055 0.00 0.00 i_83pre
3.31 641.37 28.42 75111906 0.00 0.00 WriteIRam
2.43 662.25 20.88 32932774 0.00 0.00 EA_006
1.83 678.01 15.76 75128182 0.00 0.00 WriteMem
1.09 687.42 9.41 15038860 0.00 0.00 WsGetTileRow
1.07 696.58 9.16 24611517 0.00 0.00 i_jc
1.02 705.35 8.77 11693760 0.00 0.00 Interrupt
0.80 712.24 6.89 4614768 0.00 0.00 i_80pre
0.77 718.82 6.58 2178868 0.00 0.00 WriteIO
0.72 725.04 6.22 1499804 0.00 0.00 i_pushf
0.65 730.65 5.61 24362 0.00 0.02 WsRun
...
...
0.00 859.79 0.00 1 0.00 0.00 set_display_clock_div


Como veis, hay una función llamada mcount_internal que se "chupa" el 46% del tiempo de CPU.

El caso es que en mi código no tengo ninguna llamada explícita a dicha función, aunque sí alguna referencia en el binario (comprobado con el grep), por lo que supongo que vendrá de alguna librería estandard (en mi código solo enlazo con -lpthread y -lm).

¿Alguna idea de qué función es ésta? Buscando en el Google parece que tuviera algo que ver con la glibc, pero tampoco aclaro mucho...

Muchas gracias por la ayuda :brindis:

chipan
16/05/2006, 21:38
Yo he encontrado esto buscando por google; explica cosas de la función aunque son pelin complicadas para mi:
http://www.cse.wustl.edu/~mdeters/seminar/fall2005/notes1205.html
edit: Si no he entendido mal lo que pone, que va a ser que si, parece que esa función sirve para contar las veces que se ejecutan las demás funciiones o algo así.

Electric Dreams
16/05/2006, 21:48
Cito textualmente:

You compiled with gcc, I suppose. When you profile a program, gcc insert a call to mcount in every function in the code. This function is used to count the number of times a function is called and various other things. In other words, is the profiling
function. Usually this trace info is saved in a file gmon.out, to be used later with gprof.

Y de esta página

Pulsa aquí (http://www.cs.wustl.edu/~mdeters/seminar/fall2005/notes1205.html)

cito textualmente de nuevo

so that means that the platform-independent part of mcount() is actually called mcount_internal() (though really it's called __mcount_internal(), with leading underscores)

Puck2099
16/05/2006, 21:57
Osea que eso lo mete el propio gcc al compilar con el flag de profiling (-pg), ¿verdad?

Entonces supongo que si esta función toma para sí el 46%, los porcentajes de las otras funciones serán relativos al 54% restante, ¿no? (osea que el 10.79 de ReadMem sería en realidad un 20% del total del tiempo).

Muchas gracias :brindis:

chipan
17/05/2006, 03:50
¡vaya!, parece que he acertado, despues de todo no soy tan malo.