Pregunta

Estoy corriendo en el problema siguiente, mientras perfil de una aplicación bajo VC6. Cuando el perfil de la aplicación, el perfilador está indicando que un método de obtención sencilla similar a la siguiente se está llamando a muchos cientos de miles de veces:

int SomeClass::getId() const
{
   return m_iId;
};

El problema es que este método no se llama en cualquier lugar de la aplicación de prueba . Cuando se cambia el código a la siguiente:

int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

El perfilador nunca incluye getId en la lista de funciones invocadas. Comentario la cout y estoy de vuelta a la derecha al punto de partida, más de 130 mil llamadas! Sólo para estar seguro de que no era algo de datos de perfiles en caché o tabla función de búsqueda dañado, lo estoy haciendo una limpieza y reconstruir entre cada prueba. Aún los mismos resultados!

¿Alguna idea?

¿Fue útil?

Solución

supongo que lo que sucede es que el compilador y / o el conector es 'estado uniendo' esta función muy simple de una o varias otras funciones que son idénticos (el código generado para return m_iId es probable exactamente igual que muchas otras captadores que suceden a devolver a un miembro que está en el mismo desplazamiento).

esencialmente, un manojo de funciones diferentes que pasan a tener idénticos implementaciones de código de máquina están todos resuelto a la misma dirección, confundiendo el perfilador.

puede ser capaz de evitar que esto suceda (si este es el problema) apagando optimizaciones.

Otros consejos

Asumo que está perfilando ya que desea averiguar si hay maneras de hacer que el programa tome menos tiempo, ¿verdad? Que no sólo está perfilado porque te gusta ver los números.

No es un simple, pasado de moda, probada y verdadera manera de encontrar problemas de rendimiento. Mientras se ejecuta el programa, simplemente pulse el botón de "pausa" y vistazo a la pila de llamadas. Haga esto varias veces, al igual que de 5 a 20 veces. Cuanto más grande es un problema, el menor número de muestras que necesita para encontrarlo.

Algunas personas se preguntan si esto no es básicamente lo que hacen los perfiladores, y la respuesta es sólo muy pocos. La mayoría de los perfiladores caen en una o mitos más comunes , con el resultado de que su aumento de velocidad está limitada porque no se encuentran todos los problemas:

  • Algunos programas son pasar tiempo innecesario en "puntos calientes". Cuando ese es el caso, se verá que el código en el "final" de la pila (en el que el contador de programa es) está haciendo un trabajo innecesario.

  • Algunos programas hacen más I / O de lo necesario. Si es así, se verá que están en el proceso de hacer que la E / S.

  • Las grandes programas a menudo son lentos debido a que sus árboles de llamadas son innecesariamente espeso, y la necesidad de poda. Si es así, verá el innecesaria llamadas a funciones de la pila intermedia.

Cualquier código que se ve en algún porcentaje de pilas será, si se quita, salvo el porcentaje de tiempo de ejecución (más o menos). Usted no puede ir mal. He aquí un ejemplo , durante varias iteraciones, el ahorro de más del 97 %.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top