2009-04-08 27 views
6

Estoy usando los recursos de Google (http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html) para el perfil de CPU --- es una herramienta maravillosa que me ha ayudado a realizar una gran cantidad de mejoras de tiempo de CPU en mi aplicación.perfil/optimización de C++: cómo obtener una mejor granularidad de perfiles en una función optimizada

Desafortunadamente, he llegado al punto de que el código es aún un poco lento, y cuando se compila utilizando el nivel de optimización de -O3 de g ++, todo lo que sé es que una función específica es lenta, pero no qué aspectos son lentos .

Si elimino el distintivo -O3, las partes no optimizadas del programa sobrepasan esta función y no obtengo mucha claridad en las partes reales de la función que son lentas. Si dejo el indicador -O3, entonces las partes lentas de la función están en línea, y no puedo determinar qué partes de la función son lentas.

¿Alguna sugerencia? ¡Gracias por tu ayuda!

Respuesta

5

Si está en linux, use oprofile. Si está en Windows, use AMD's CodeAnalyst.

Ambos darán los perfiles basados ​​en muestras hasta el nivel de las líneas fuente individuales o las instrucciones de ensamblaje, y no debería tener problemas para identificar los "puntos calientes" dentro de las funciones.

+0

No puedo hablar por CodeAnalyst, pero oprofile es increíble! el comando opannotate me dio una anotación de línea de origen tal como lo describió. ¡Gracias! – Adam

+1

CodeAnalyst es una GUI sobre una versión especializada de oprofile. También puede usar CodeAnalyst en Linux. – Carlos

6

para algo como esto, yo siempre he usado la forma en la "vieja escuela" de hacerlo:

Insertar en la rutina que desea medir en varios puntos de las declaraciones que miden el tiempo actual (o cputime). Luego simplemente imprima o registre las diferencias entre ellos y sabrá cuánto tiempo tomó cada sección del código. A partir de ahí, puede averiguar qué está comiendo la mayor parte del tiempo, y entrar y obtener un calendario detallado dentro de esa sección hasta que sepa cuál es el problema y cómo solucionarlo.

Si la sobrecarga de las llamadas de función no es el problema, también puede forzar que la línea entrante se apague con -fno-inline-small-functions -fno-inline-functions -fno-inline-functions-called-once -fno-inline (no estoy exactamente seguro de cómo estos switches interactúan entre sí, pero creo que son independientes). Luego puede usar su perfilador ordinario para mirar el perfil del gráfico de llamadas y ver qué llamadas de función están tomando la cantidad de tiempo.

+0

Gracias Greg! Si no hubiera sido por oprofile (abajo), creo que habría optado por la idea de sincronización de precisión que sugirió. – Adam

1

Pasé décadas haciendo ajuste del rendimiento.

La gente ama sus herramientas, pero juro por this method.

Cuestiones relacionadas