portable - programacion c++ ejemplos
¿Perfil de C++ en presencia de en línea agresivo? (6)
Estoy tratando de averiguar dónde mi programa de C ++ está gastando su tiempo, usando gprof. Aquí está mi dilema: si compilo con la misma configuración de optimización que uso para la compilación de mi versión, casi todo se integra, y gprof me dice, de manera poco útil, que el 90% de mi tiempo se invierte en una rutina central, donde todo estaba en línea. Por otro lado, si compilo con el inline deshabilitado, el programa ejecuta un orden de magnitud más lento.
Quiero saber cuánto tiempo tardan los procedimientos llamados desde mi rutina central, cuando mi programa se compila con el inline habilitado.
Estoy ejecutando Ubuntu 9.04 de 64 bits en una máquina Intel de cuatro núcleos. Busqué en google-perftools, pero eso no parece funcionar bien en x86_64. Ejecutar en una máquina de 32 bits no es una opción.
¿Alguien tiene sugerencias sobre cómo puedo perfilar mi aplicación de manera más efectiva, cuando la inscripción está habilitada?
Edit: Aquí hay una aclaración de mi problema. Pido disculpas si no estaba claro inicialmente.
Quiero encontrar dónde se estaba gastando el tiempo en mi solicitud. Al perfilar mi compilación optimizada, gprof me dijo que casi el 90% del tiempo se invierte en main, donde todo estaba en línea. ¡Ya lo sabía antes de perfilar!
Lo que quiero saber es cuánto tiempo llevan las funciones en línea, preferiblemente, sin desactivar la optimización o incorporarme en mis opciones de compilación. La aplicación es algo así como un orden de magnitud más lento cuando se perfila con inlining inline. Esta diferencia en el tiempo de ejecución es un problema de conveniencia, pero tampoco confío en que el perfil de rendimiento del programa creado con la inhabilitación deshabilitada corresponda en gran medida con el perfil de rendimiento del programa creado con la habilitación habilitada.
En resumen: ¿hay una manera de obtener información útil sobre la creación de perfiles en un programa de C ++ sin desactivar la optimización o la integración?
¿ valgrind sería más útil?
Combinado con KCachegrind GUI, ofrece una forma fácil y gratuita de navegar por el código anotado adecuado para el código en línea. Aquí tienes una instrucción bastante sencilla: http://web.stanford.edu/class/cs107/guide_callgrind.html
Desarrolle algunas macros utilizando el mecanismo de sincronización de alto rendimiento de su CPU (por ejemplo, x86 ), las rutinas que no dependen de las llamadas del sistema, y enlace un solo hilo que ejecuta su bucle central a una CPU específica ( establezca la afinidad ). Necesitarías implementar las siguientes macros.
PROF_INIT //allocate any variables -- probably a const char
PROF_START("name") // start a timer
PROF_STOP() // end a timer and calculate the difference --
// which you write out using a async fd
Tenía algo como esto que coloqué en cada función en la que estaba interesado; me aseguré de que la macro colocara las llamadas de tiempo en el contexto del árbol de llamadas; esta es posiblemente la forma más precisa de perfilar.
Nota:
Este método se basa en su código, y no se basa en una herramienta externa para rastrear su código de ninguna manera. La indagación, el muestreo y la generación de perfiles por interrupción son inexactos cuando se trata de pequeñas secciones de código. Además, desea controlar dónde y cuándo se recopilan los datos de tiempo, como en construcciones específicas de su código, como los bucles, el comienzo de una cadena de llamadas recursiva o asignaciones de memoria masiva.
editar
Quizás te interese el enlace de esta respuesta a una de mis preguntas .
No importa que el código se ejecute más lento (aparte de su conveniencia, por supuesto), el generador de perfiles aún le indicará la proporción correcta de tiempo empleado en cada función.
Puede usar gcov para darle cuentas de ejecución línea por línea. Esto debería, al menos, indicarle qué funciones en línea son el cuello de botella.
Puede usar un generador de perfiles más potente, como VTune de Intel, que le puede proporcionar un nivel de línea de ensamblaje de detalles de rendimiento.
http://software.intel.com/en-us/intel-vtune/
Es para Windows y Linux, pero cuesta dinero ...
Supongo que lo que desea hacer es averiguar qué líneas de código le están costando lo suficiente como para que valga la pena optimizarlas . Eso es muy diferente de las funciones de tiempo. Puedes hacerlo mejor que gprof .
Aquí hay una explicación bastante completa de cómo hacerlo.
Puede hacerlo a mano, o usar uno de los perfiladores que pueden proporcionar la misma información, como oprofile y RotateRight/Zoom .
Por cierto, la alineación tiene un valor significativo solo si las rutinas que se están alineando son pequeñas y no llaman a las funciones en sí mismas, y si las líneas donde se están llamando están lo suficientemente activas como para ser significativas.
En cuanto al orden de magnitud, la relación de rendimiento entre la depuración y la versión de lanzamiento, puede deberse a una serie de cosas, tal vez o no a la incorporación. Puede usar el método de stackshot mencionado anteriormente para descubrir con certeza qué ocurre en cada caso. Descubrí que las compilaciones de depuración pueden ser lentas por otras razones, como la validación de la estructura de datos recursiva, por ejemplo.