2009-05-13 18 views
13

Estoy tratando de encontrar los analizadores de código abierto en lugar de utilizar uno de los perfiles comerciales que tengo que pagar $$$. Cuando realicé una búsqueda en SourceForge, me he encontrado con estas cuatro perfiladores C++ que yo pensaba que eran bastante prometedor:Perfiladores de código abierto recomendados

  1. Brillante: C++ Profiler
  2. baja en grasa Profiler
  3. Lucas Stackwalker
  4. FreeProfiler

No estoy seguro de cuál de los profilers sería el mejor para usar en términos de aprendizaje sobre el rendimiento de mi programa. Sería genial escuchar algunas sugerencias.

+0

¿Qué plataforma? Yo uso gprof cuando estoy trabajando con g ++ en Linux. –

+0

Mi programa se ejecuta en Windows XP. – stanigator

Respuesta

6

Puede probar Windows Performance Toolkit. Completamente gratis para usar. Este blog entry tiene un ejemplo de cómo hacer perfiles basados ​​en muestras.

+0

Acabo de investigarlo, pero descubrí que necesito ejecutar Windows Vista o Server 2008 en mi computadora para poder instalarlo. Como no quiero instalar Windows Vista en la computadora portátil que estoy usando para el desarrollo, que está ejecutando XP, no creo que pueda ir personalmente con esta opción. Gracias por la sugerencia de todos modos. – stanigator

+0

Me gustó Very Sleepy o incluso Luke Stackwolker mejor. xPerf suena bien en teoría, pero en la práctica es muy difícil de usar, es difícil de ejecutar, procesa lentamente los datos. – Suma

0

Utilizamos LtProf y hemos estado contentos con él. No es de código abierto, pero sólo $$, no $$$ :-)

3

Hay más de una manera de hacer eso.

Don't forget the no-profiler method.

La mayoría de los perfiladores asumen que necesita 1) de alta precisión estadística de tiempo (un montón de muestras), y 2) la baja precisión de la identificación del problema (funciones & call-gráficos).

Esas prioridades se pueden revertir. Es decir. el problema puede ubicarse en la dirección precisa de la máquina, mientras que la precisión en el costo es una función del número de muestras.

La mayoría de los problemas reales cuestan al menos 10%, donde la alta precisión no es esencial.

Ejemplo: Si algo está haciendo que su programa tome el doble de tiempo que debería, eso significa que hay un código que cuesta el 50%. Si toma 10 muestras de la pila de llamadas mientras está lenta, las líneas precisas de código estarán presentes en aproximadamente 5 de ellas. Cuanto más grande es el programa, más probable es que el problema sea una llamada de función en algún lugar de la mitad de la pila.

Es contra intuitivo, lo sé.

NOTA: xPerf está casi allí, pero no del todo (por lo que puedo decir). Toma muestras de la pila de llamadas y las guarda; eso es bueno. Esto es lo que creo que necesita:

  • Solo debe tomar muestras cuando las desee. Tal como están las cosas, debes filtrar las irrelevantes.

  • En la vista de la pila debe mostrar las líneas o direcciones específicas en las que tienen lugar las llamadas, no solo las funciones completas. (Tal vez puede hacer esto, no podría decirlo desde el blog.)

  • Si hace clic para obtener la vista de mariposa, centrada en una sola instrucción de llamada o instrucción de hoja, debería mostrarle no la fracción de CPU, sino la fracción de muestras de pila que contiene esa instrucción. Esa sería una medida directa del costo de esa instrucción, como una fracción de tiempo. (Tal vez puede hacer esto, no podría decirlo). Entonces, por ejemplo, incluso si una instrucción fuera una llamada al archivo abierto u otra cosa que ralentiza el hilo, aún le cuesta tiempo al reloj de pared, y necesita saber que.

NOTA: Acabo de revisar a Luke Stackwalker, y se aplican las mismas observaciones. Creo que está en el camino correcto, pero necesita un trabajo de IU.

AGREGADO: Después de haber examinado a LukeStackwalker con más cuidado, me temo que es víctima de la suposición de que la medición de funciones es más importante que la localización de enunciados. Entonces, en cada muestra de la pila de llamadas, actualiza la información de sincronización del nivel de función, pero todo lo que hace con la información del número de línea es realizar un seguimiento de los números de línea máximos y mínimos en cada función, que, cuantas más muestras tome, más alejados se ponen. Por lo tanto, básicamente descarta la información más importante: la información del número de línea. La razón por la que es importante es que si decide optimizar una función, necesita saber qué líneas necesitan funcionar, y esas líneas estaban en las muestras de la pila (antes de que fueran descartadas).

Uno podría objetar que si la información del número de línea se conservara se agotaría rápidamente. Dos respuestas 1) Solo hay tantas líneas que aparecen en las muestras y aparecen repetidamente. 2) No se necesitan tantas muestras, siempre se ha asumido la suposición de que es necesaria una alta precisión estadística de medición, pero nunca se justifica.

Sospecho que otros muestrarios de pila, como xPerf, tienen problemas similares.

2

No es de código abierto, pero AMD CodeAnalyst es gratis. También funciona en CPU Intel a pesar del nombre. Hay versiones disponibles para Windows (con integración de Visual Studio) y Linux.

2

De aquellos que figuran en la lista, he encontrado que Luke Stackwalker funciona mejor: me gustó su GUI, era fácil de poner en funcionamiento.

Otro similar es Very Sleepy - funcionalidad similar, el muestreo parece más confiable, GUI quizás un poco más difícil de usar (no ese gráfico).


Después de pasar más tiempo con ellos, he encontrado un inconveniente bastante importante. Si bien ambos intentan muestrear a una resolución de 1 ms, en la práctica no lo logran porque su método de muestreo (StackWalk64 del proceso adjunto) es demasiado lento. Para mi aplicación, toma algo así como 5-20 ms para obtener una pila de llamadas. No solo esto hace que los resultados sean imprecisos, sino que también los sesga, ya que las callstacks cortas se recorren más rápido, por lo tanto, tienden a obtener más visitas.

+0

Hola de nuevo, Suma.El porcentaje aproximado de IMO del tiempo total utilizado por cada línea de código (o función, si lo desea) es más importante de conocer que el tiempo absoluto preciso, y el porcentaje de tiempo no debe verse afectado por la sobrecarga de muestreo o la frecuencia de muestreo. –

+0

El principal problema es "las llamadas cortas se recorren más rápido". Esto hace que la frecuencia de muestreo sea variable dependiendo de la profundidad de la pila de llamadas cuando se intenta muestrear a 1 ms, lo que definitivamente es algo malo. El muestreo a 20 ms sería posible, pero eso es demasiado grosero para mí. He implementado un método de muestreo diferente en una versión derivada (no publicada en ningún lugar), donde la aplicación muestrea sus callstacks por sí misma y envía los resultados al perfilador Sleepy a través de un canalización con nombre. De esta forma, el muestreo es aproximadamente 1000 veces más rápido (1-5 us), lo que hace que el muestreo de 1 ms funcione muy bien. – Suma

+0

Es natural suponer que debe tomar tantas muestras como sea posible tan rápido como sea posible (para la precisión de la estimación del tiempo), pero si alguna actividad toma el 10% del tiempo, aparecerá en aproximadamente el 10% de las muestras, ya sea tome 20 muestras o 20,000, * siempre que las muestras ocurran en momentos impredecibles * con respecto a lo que está haciendo el programa. Para que no tengas problemas para encontrarlo, saltará hacia ti. http://stackoverflow.com/questions/406760/whats-your-most-controversial-programming-opinion/1562802#1562802 –