Una vez más, stack sampling to the rescue! Solo toma un montón de "Stackshots", tantas como quieras. Deseche cualquier muestra donde su función (llámala F) no esté en algún lugar de la pila.(Si está descartando la mayoría de ellos, entonces F no es un problema de rendimiento.)
En cada muestra restante, ubique la llamada en F y vea qué función (llámala G) esa llamada está activada. Si F es recursivo (aparece más de una vez en la muestra) solo usa la llamada más alta.
clasificar su Gs por el número de pilas aparece en cada una.
Si no quieres hacer esto a mano, se puede hacer una sencilla herramienta o script. No necesitas un trillón de muestras. 20 o más le darán información razonablemente buena.
Por cierto,, si lo que realmente está tratando de hacer es encontrar problemas de rendimiento, en realidad no necesita hacer todo ese descarte y clasificación. De hecho, no descartes las ubicaciones exactas de la instrucción de llamada dentro de cada G. Esos datos pueden darte un poco más que el hecho de que estaban en algún lugar dentro de G.
P.S. Todo esto se basa en la suposición de que cuando dice "lo llama más" quiere decir "gasta la mayor cantidad de tiempo de reloj de pared en llamarlo", no "lo llama el mayor número de veces". Si está interesado en el rendimiento, la fracción del tiempo del reloj de pared es más útil que el conteo de llamadas.
¿No puedes hacer esto? –
No lo sé, ¿verdad? – vehomzzz
nunca usado gprof – vehomzzz