Callgrind: Perfil de una parte específica de mi código
Estoy tratando de perfilar (con Callgrind) una parte específica de mi código eliminando el ruido y los cálculos que no me importan. Aquí hay un ejemplo de lo que quiero hacer:
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
//Method to be profiled with these data
//Post operation on the data
}
Mi caso de uso es una prueba de regresión. Quiero asegurarme de que el método en cuestión sea lo suficientemente rápido (algo así como menos de un 10% de instrucciones adicionales desde la última implementación). Por eso me gustaría tener la salida más limpia de Callgrind. (Necesito un bucle for para tener una cantidad significativa de datos procesados para tener una buena estimación del comportamiento del método que quiero perfilar)
Mi primer intento fue cambiar el código a:
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
CALLGRIND_START_INSTRUMENTATION;
//Method to be profiled with these data
CALLGRIND_STOP_INSTRUMENTATION;
//Post operation on the data
}
CALLGRIND_DUMP_STATS;
Añadiendo las macros de Callgrind para controlar la instrumentación. También agregué las opciones --instr-atstart = no para estar seguro de que perfilé solo la parte del código que quiero ...
Desafortunadamente, con esta configuración, cuando comienzo a ejecutar mi ejecutable con callgrind, nunca termina ... No es una cuestión de lentitud, ya que la instrumentación completa dura menos de un minuto.
Yo tambien lo intenté
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
CALLGRIND_TOGGLE_COLLECT;
//Method to be profiled with these data
CALLGRIND_TOGGLE_COLLECT;
//Post operation on the data
}
CALLGRIND_DUMP_STATS;
(o la opción --toggle-collect = "myMethod") Pero Callgrind me devolvió un registro sin ninguna llamada (KCachegrind es blanco como la nieve :( y dice cero instrucciones ...)
¿Usé las macros / opciones correctamente? ¿Alguna idea de lo que necesito cambiar para obtener el resultado esperado?