Más allá del muestreo de pila: Analizadores de C ++

146

El cuento de un hacker

La fecha es 12/02/10. Los días antes de Navidad están goteando y he llegado a un obstáculo importante como programador de Windows. He estado usando AQTime, he probado soñoliento, brillante y con mucho sueño, y mientras hablamos, VTune se está instalando. Intenté usar el perfilador VS2008, y ha sido muy positivo y a menudo insensible. He usado la técnica de pausa aleatoria. He examinado los call-trees. He disparado rastros de funciones. Pero el hecho triste y doloroso del asunto es que la aplicación con la que estoy trabajando tiene más de un millón de líneas de código, con probablemente otro millón de líneas de aplicaciones de terceros.

Necesito mejores herramientas He leído los otros temas. He probado cada perfilador enumerado en cada tema. Simplemente tiene que haber algo mejor que estas opciones chatarra y costosa, o cantidades ridículas de trabajo para casi ninguna ganancia. Para complicar aún más las cosas, nuestro código está muy enhebrado y ejecuta una serie de bucles Qt Event, algunos de los cuales son tan frágiles que se bloquean bajo una fuerte instrumentación debido a retrasos en el tiempo. No me preguntes por qué estamos ejecutando múltiples bucles de eventos. Nadie me lo puede decir.

¿Hay alguna opción más similar a Valgrind en un entorno Windows?
¿Hay algo mejor que la larga franja de herramientas rotas que ya he probado?
¿Hay algo diseñado para integrarse con Qt, tal vez con una visualización útil de eventos en cola?

Una lista completa de las herramientas que probé, con las que fueron realmente útiles en cursiva:

  • AQTime: ¡ Bastante bueno! Tiene algunos problemas con la recursividad profunda, pero el gráfico de llamadas es correcto en estos casos y puede usarse para aclarar cualquier confusión que pueda tener. No es una herramienta perfecta, pero vale la pena probarla. Puede satisfacer sus necesidades, y ciertamente fue lo suficientemente bueno para mí la mayor parte del tiempo.
  • Ataque de pausa aleatoria en modo de depuración: no hay suficiente información del tiempo.
    Una buena herramienta pero no una solución completa.
  • Estudios paralelos: la opción nuclear. Obstinado, extraño y locamente poderoso. Creo que deberías comenzar la evaluación de 30 días y averiguar si es una buena opción. También es genial.
  • Codeanalyst de AMD: maravilloso, fácil de usar, muy propenso a los choques, pero creo que eso es algo medioambiental. Recomiendo probarlo, ya que es gratis.
  • Luke Stackwalker: Funciona bien en proyectos pequeños, está tratando de hacer que funcione en los nuestros. Sin embargo, algunos buenos resultados, y definitivamente reemplaza a Sleepy para mis tareas personales.
  • PurifyPlus: no es compatible con entornos Win-x64, principalmente Windows 7. De lo contrario, excelente. Varios de mis colegas en otros departamentos lo juran.
  • VS2008 Profiler: Produce resultados en el rango de más de 100 gigas en el modo de rastreo de función con la resolución requerida. En el lado positivo, produce resultados sólidos.
  • GProf: Requiere que GCC sea incluso moderadamente efectivo.
  • VTune: el soporte W7 de VTune limita con el criminal. Por lo demás excelente
  • PIN: Necesitaría hackear mi propia herramienta, así que este es un último recurso.
  • Sleepy \ VerySleepy: útil para aplicaciones más pequeñas, pero me falla aquí.
  • EasyProfiler: no está mal si no le importa un poco de código inyectado manualmente para indicar dónde instrumentar.
  • Valgrind: * nix solamente, pero muy bueno cuando estás en ese entorno.
  • OProfile: solo Linux.
  • Proffy: disparan caballos salvajes.

Herramientas sugeridas que no he probado:

  • XPerf:
  • Glowcode:
  • Devpartner:

Notas: entorno Intel en este momento. VS2008, impulsar bibliotecas. Qt 4+. Y el miserable humdinger de todos ellos: integración Qt / MFC a través de trolltech.


Ahora: casi dos semanas después, parece que mi problema está resuelto. Gracias a una variedad de herramientas, que incluyen casi todo en la lista y algunos de mis trucos personales, encontramos los principales cuellos de botella. Sin embargo, voy a seguir probando, explorando y probando nuevos perfiladores, así como nuevas tecnologías. ¿Por qué? Porque se los debo a ustedes, porque ustedes rockeros Se ralentiza un poco la línea de tiempo, pero todavía estoy muy emocionado de seguir probando nuevas herramientas.

Sinopsis
Entre muchos otros problemas, varios componentes se cambiaron recientemente al modelo de subprocesamiento incorrecto, lo que provocó serios problemas debido al hecho de que el código subyacente ya no era multiproceso. No puedo decir más porque viola mi NDA, pero puedo decirte que esto nunca habría sido encontrado por una inspección casual o incluso por una revisión de código normal. Sin perfiladores, gráficos de llamada y pausas aleatorias en conjunto, todavía estaríamos gritando nuestra furia al hermoso arco azul del cielo. Afortunadamente, trabajo con algunos de los mejores piratas informáticos que he conocido, y tengo acceso a un increíble verso lleno de excelentes herramientas y excelentes personas.

Caballeros, lo aprecio enormemente, y solo lamento no tener suficiente representante para recompensar a cada uno de ustedes con una recompensa. Todavía creo que esta es una pregunta importante para obtener una mejor respuesta que las que tenemos hasta ahora en SO.

Como resultado, cada semana durante las próximas tres semanas, ofreceré la mayor recompensa que pueda pagar, y la otorgaré a la respuesta con la herramienta más agradable que creo que no es de conocimiento común. Después de tres semanas, es de esperar que hayamos acumulado un perfil definitivo de los perfiladores, si me disculpa mi castigo.

Para llevar
Use un perfilador. Son lo suficientemente buenos para Ritchie, Kernighan, Bentley y Knuth. No me importa quién creas que eres. Utiliza un perfilador. Si el que tienes no funciona, busca otro. Si no puede encontrar uno, codifique uno. Si no puede codificar uno, o es un pequeño bloqueo, o simplemente está atascado, use una pausa aleatoria. Si todo lo demás falla, contrata a algunos estudiantes de posgrado para golpear a un perfilador.


Una vista mas larga
Entonces, pensé que sería bueno escribir un poco de retrospectiva. Opté por trabajar extensamente con Parallel Studios, en parte porque en realidad está construido sobre la herramienta PIN. Habiendo tenido relaciones académicas con algunos de los investigadores involucrados, sentí que esto probablemente era una marca de cierta calidad. Afortunadamente, tenía razón. Si bien la GUI es un poco terrible, descubrí que IPS es increíblemente útil, aunque no puedo recomendarlo cómodamente para todos. Críticamente, no hay una forma obvia de obtener recuentos de aciertos a nivel de línea, algo que proporcionan AQT y varios otros perfiladores, y he encontrado muy útil para examinar la tasa de selección de sucursales, entre otras cosas. En la red, también he disfrutado usando AQTime, y he encontrado que su soporte es realmente receptivo. Nuevamente, debo calificar mi recomendación: Muchas de sus características no funcionan tan bien, y algunas de ellas son francamente propensas a fallas en Win7x64. XPerf también tuvo un desempeño admirable, pero es extremadamente lento para los detalles de muestreo necesarios para obtener buenas lecturas en ciertos tipos de aplicaciones.

En este momento, debo decir que no creo que haya una opción definitiva para perfilar el código C ++ en un entorno W7x64, pero ciertamente hay opciones que simplemente no pueden realizar ningún servicio útil.

Jake Kurzer
fuente
18
¿Has buscado conseguir un trabajo diferente? :)
Nikolai Fetissov
10
¿Dónde más podría resolver rompecabezas tan difícil? Supongo que podría volver al hackeo del kernel, pero eso no paga tan bien.
Jake Kurzer
3
@Kos Creo que para que gprof sea de alguna utilidad, debe usar el conjunto de herramientas gcc compilado con -pg; de lo contrario, no produce el archivo gprof.out. En el caso del OP, parece que está usando msvc, lo que descarta usar gprof. Por otra parte yo no' pensar gprof haría justo nada mejor para él si los otros en la lista no están cumpliendo sus necesidades
greatwolf
2
@Marc Gravell Eso es bastante justo, supongo ... Me parece una extraña heurística, que las publicaciones mejor mantenidas pasan abruptamente al dominio de la comunidad, produciendo efectivamente una situación en la que cuanto más actualizas y mantienes tu pregunta o respuesta , cuanto menos obtenga de ese mantenimiento a los ojos de la comunidad en general. ¿Debo llevar esto a meta?
Jake Kurzer
2
¿Alguien quiere una retrospectiva, dado lo que ahora sé sobre los perfiladores?
Jake Kurzer el

Respuestas:

65

Primero:

Los perfiladores de muestreo de tiempo son más robustos que los perfiladores de muestreo de CPU. No estoy muy familiarizado con las herramientas de desarrollo de Windows, así que no puedo decir cuáles son cuáles. La mayoría de los perfiladores son de muestreo de CPU.

Un generador de perfiles de muestreo de CPU toma un seguimiento de la pila cada N instrucciones.
Esta técnica revelará partes de su código que están vinculadas a la CPU. Lo cual es increíble si ese es el cuello de botella en su aplicación. No es tan bueno si los hilos de su aplicación pasan la mayor parte de su tiempo peleando por un mutex.

Un perfilador de muestreo de tiempo toma un seguimiento de la pila cada N microsegundos.
Esta técnica se centrará en el código "lento" . Si la causa está vinculada a la CPU, bloqueando las secciones de código vinculadas a E / S, vinculadas a mutex o cacheando. En resumen, cualquier fragmento de código que esté desacelerando su aplicación se destacará.

Por lo tanto, use un generador de perfiles de muestreo de tiempo si es posible, especialmente al perfilar código enhebrado.

Segundo:

Los perfiladores de muestreo generan grandes cantidades de datos. Los datos son extremadamente útiles, pero a menudo hay demasiados para ser fácilmente útiles. Un visualizador de datos de perfil ayuda enormemente aquí. La mejor herramienta que he encontrado para la visualización de datos de perfil es gprof2dot . No deje que el nombre lo engañe, maneja todo tipo de salida de perfilador de muestreo (AQtime, Sleepy, XPerf, etc.). Una vez que la visualización ha señalado la (s) función (es) ofensiva (s), regrese a los datos de perfil sin procesar para obtener mejores pistas sobre cuál es la verdadera causa.

La herramienta gprof2dot genera una descripción de gráfico de puntos que luego se introduce en una herramienta de gráficos . El resultado es básicamente un callgraph con funciones codificadas por colores por su impacto en la aplicación. texto alternativo

Algunas sugerencias para que gprof2dot genere una buena salida.

  • Utilizo un --skew0.001 en mis gráficos para poder ver fácilmente las rutas de los códigos activos. De lo contrario, int main()domina el gráfico.
  • Si estás haciendo algo loco con las plantillas de C ++, probablemente quieras agregarlas --strip. Esto es especialmente cierto con Boost.
  • Yo uso OProfile para generar mis datos de muestreo. Para obtener un buen resultado, necesito configurarlo para cargar los símbolos de depuración de mis bibliotecas de terceros y del sistema. Asegúrese de hacer lo mismo, de lo contrario verá que CRT está tomando el 20% del tiempo de su aplicación cuando lo que realmente está sucediendo malloces destruir el montón y consumir el 15%.
código_deft
fuente
Si bien no sé si esta es la respuesta completa a mis problemas, gprof2dot ha ingresado a mi vasto arsenal y está asumiendo rápidamente un lugar favorito. ¡Creo que vale la pena!
Jake Kurzer
2
Le hice esta pregunta al generador de perfiles basado en muestras de tiempo de Linux . Se supone que OProfile obtiene el muestreo basado en el tiempo eventualmente. Producen resultados de muy alta calidad, así que una vez que agreguen esa característica, los usaré. Aparte de eso, hice que un amigo pirateara una solución gdb + backtrace para crear perfiles. Muy chiflado, pero encontró el cuello de botella.
deft_code
@deft_code: " piratea una solución gdb + backtrace para la creación de perfiles. Muy hacky, pero encontró el cuello de botella". Estás confirmando mi diatriba constante :) Algunas personas quieren que los perfiles sean bonitos, pero si los resultados son lo que necesitas, elige lo que funciona, no lo que es bonito .
Mike Dunlavey
Estoy de acuerdo con Mike Dunlavey. Cosas como XPerf / WPA se ven muy bonitas y poderosas, pero descubrir cómo usar estas herramientas lleva un tiempo, y al final del día, la pausa aleatoria es muy fácil y proporciona mejor información para resolver el problema. Las soluciones más automatizadas parecen filtrar la información crítica necesaria para resolver el cuello de botella.
JDiMatteo
16

¿Qué pasó cuando intentaste una pausa aleatoria? Lo uso todo el tiempo en una aplicación monstruosa. Dijiste que no daba suficiente información, y has sugerido que necesitas alta resolución. A veces las personas necesitan un poco de ayuda para entender cómo usarlo.

Lo que hago, bajo VS, es configurar la pantalla de la pila para que no me muestre los argumentos de la función, porque eso hace que la pantalla de la pila sea totalmente ilegible, IMO.

Luego tomo alrededor de 10 muestras presionando "pausa" durante el tiempo que me está haciendo esperar . Utilizo ^ A, ^ C y ^ V para copiarlos en el bloc de notas, como referencia. Luego estudio cada uno, para tratar de descubrir qué era lo que estaba tratando de lograr en ese momento.

Si estaba tratando de lograr algo en 2 o más muestras, y eso no es estrictamente necesario, entonces he encontrado un problema en vivo, y sé aproximadamente cuánto ahorrará solucionarlo.

Hay cosas que realmente no necesita saber, como porcentajes exactos no son importantes, y lo que sucede código dentro de 3 ª parte no es importante, porque no se puede hacer nada acerca de aquellos . De lo que puede hacer algo es del rico conjunto de puntos de llamada en el código que puede modificar en cada muestra de la pila. Ese es tu feliz coto de caza.

Ejemplos del tipo de cosas que encuentro:

  • Durante el inicio, puede tener aproximadamente 30 capas de profundidad, en el proceso de intentar extraer cadenas de caracteres internacionalizadas de los recursos de DLL. Si se examinan las cadenas reales, puede resultar fácilmente que las cadenas realmente no necesitan ser internacionalizadas, como si fueran cadenas que el usuario nunca ve realmente.

  • Durante el uso normal, algunos códigos establecen inocentemente una propiedad Modificada en algún objeto. Ese objeto proviene de una superclase que captura el cambio y desencadena notificaciones que se extienden por toda la estructura de datos, manipulando la interfaz de usuario, creando y destruyendo obedece de formas difíciles de prever. Esto puede suceder mucho: las consecuencias inesperadas de las notificaciones.

  • Completar una hoja de trabajo fila por fila, celda por celda. Resulta que si construyes la fila de una vez, a partir de una matriz de valores, es mucho más rápido.

PD: si tienes varios subprocesos, cuando lo pausas, todos los hilos se pausan. Echa un vistazo a la pila de llamadas de cada hilo. Lo más probable es que solo uno de ellos sea el verdadero culpable, y los otros están inactivos.

Mike Dunlavey
fuente
2
Comentarios? Comentarios? ¡ESTO ES ESPARTA! Yo ... Lo siento, no sé de dónde vino eso. No, el código hace que Klingon Opera parezca legible, y está muy bien documentado. En realidad, creo que está mucho menos documentado ... Oh, Dios.
Jake Kurzer
3
Integración QTMFC? Oh, genial, tienes complicado y malvado , y aún no has llegado al código específico de la aplicación.
Ben Voigt
55
QT / MFC? ¿No debería eso producir niños mutantes con 3 cabezas que se balancean de un lado a otro mientras llaman a cada idea que escuchan la idea más estúpida? Errr ... Me estoy desviando ... Si está utilizando alguna de las clases de Socket MFC, reescriba inmediatamente su código de socket y luego su perfil. Hay MUCHOS lugares en el código CSocket que usan la versión de bucle de mensajes de WaitForSingleObject que he encontrado para matar el rendimiento. Por mi vida no puedo recordar el nombre de la función de espera ...: /
JimR
2
Oh dios, confía en mí, es exactamente tan chiflado como crees.
Jake Kurzer
3
@Jake: No hay mucho consuelo, pero esa es la gloria de la universalidad de Turing. Cualquier idioma, sin importar cuán alto o bajo nivel, es equivalente en su capacidad ilimitada de ser mal utilizado.
Mike Dunlavey
8

He tenido cierto éxito con AMD CodeAnalyst .

Adam Rosenfield
fuente
Entorno Intel, por el momento. ¡Aunque lo tendré en cuenta! :)
Jake Kurzer
44
@Jake: No estoy seguro de lo que quieres decir allí. AMD CodeAnalyst no requiere chips AMD, debería funcionar en la mayoría de los chips x86 o x64 (también conocidos como x86-64 / IA-64 / AMD64), incluidos los chips Intel.
Adam Rosenfield
1
Al parecer, soy analfabeta! Esa es una noticia maravillosa. Lo probaré mañana y actualizaré la pregunta.
Jake Kurzer
Hasta ahora, es muy inestable al muestrear en las resoluciones que necesito.
Jake Kurzer
@ Adam: probé el analista de código en una máquina Intel Pentium IV recientemente, y solo ofreció muestreo basado en el tiempo, sin información sobre el uso del hilo, ni información relacionada con el hilo en absoluto ... la cantidad de información que obtuve fue realmente mediocre ... adicionalmente causó fallas en la integración qt de visual studio .. no estaba satisfecho :(
smerlin
7

¿Tiene una función MFC OnIdle? En el pasado, tenía una aplicación casi en tiempo real que tenía que arreglar, que dejaba caer paquetes en serie cuando se configuraba a una velocidad de 19.2K, que un PentiumD debería haber podido seguir. La función OnIdle era lo que estaba matando cosas. No estoy seguro de si QT tiene ese concepto, pero también lo comprobaría.

JimR
fuente
2
De hecho, tenemos un OnIdle, y gracias a nuestra integración QTMFC, fluye a través del ciclo de eventos QT ev..e ... eve ... Oh Dios.
Jake Kurzer
Resulta que esto condujo directamente a nuestra solución, por lo que si bien no es una respuesta perfecta a la pregunta, creo que la pregunta no tiene respuesta.
Jake Kurzer
4

Vuelva al VS Profiler: si está generando archivos tan grandes, ¿quizás su intervalo de muestreo es demasiado frecuente? Intente bajarlo, ya que probablemente tenga suficientes muestras de todos modos.

E idealmente, asegúrese de no recolectar muestras hasta que realmente esté ejercitando el área problemática. Así que comience con la colección en pausa, haga que su programa haga su "actividad lenta", luego comience la colección. Solo necesita como máximo 20 segundos de recolección. Detener la colección después de esto.

Esto debería ayudar a reducir el tamaño de los archivos de muestra y solo capturar lo que sea necesario para su análisis.

Alex Budovski
fuente
Mañana intentaré esto.
Jake Kurzer
4

He utilizado con éxito PurifyPlus para Windows. Aunque no es barato, IBM proporciona una versión de prueba que está ligeramente paralizada. Todo lo que necesita para perfilar con cuantificar son archivos PDB y la vinculación con / FIJO: NO. Único inconveniente: no es compatible con Win7 / 64.

hmuelner
fuente
Desafortunadamente, nuestro objetivo principal es Win7. Agregaré esa información a la publicación principal.
Jake Kurzer
1
La versión actual de PurifyPlus es compatible con Win7 / 64.
hmuelner
3

Easyprofiler : aún no lo he visto aquí, así que no estoy seguro de si ya lo has visto. Toma un enfoque ligeramente diferente en la forma en que recopila datos métricos. Un inconveniente de usar su enfoque de perfil de tiempo de compilación es que debe realizar cambios en la base de código. Por lo tanto, necesitará tener una idea de dónde podría estar la lentitud e insertar el código de perfil allí.

A juzgar por sus comentarios sin embargo, parece que estás haciendo al menos algunos progresos. Quizás esta herramienta pueda proporcionarle algunas métricas útiles. Si nada más, tiene algunos cuadros e imágenes realmente purdy: P

gran lobo
fuente
3

Dos sugerencias de herramientas más.

Luke Stackwalker tiene un lindo nombre (incluso si se está esforzando un poco para mi gusto), no le costará nada y obtendrá el código fuente. Afirma que también admite programas de subprocesos múltiples. Por lo tanto, vale la pena probarlo.

http://lukestackwalker.sourceforge.net/

También Glowcode, que me he señalado que vale la pena usar:

http://www.glowcode.com/

Desafortunadamente, no he hecho ningún trabajo de PC por un tiempo, así que no he probado ninguno de estos. Espero que las sugerencias sean de ayuda de todos modos.


fuente
3

Checkout XPerf

Este es un perfilador gratuito, no invasivo y extensible ofrecido por MS. Fue desarrollado por Microsoft para perfilar Windows.

Sanjit Saluja
fuente
3

Si sospecha del bucle de eventos, ¿podría anular QCoreApplication :: notify () y el perfil manual de dosome (uno o dos mapas de remitentes / eventos a recuentos / tiempo)?

Estoy pensando que primero registra la frecuencia de los tipos de eventos, luego examina esos eventos con más cuidado (qué objeto lo envía, qué contiene, etc.). Las señales en los subprocesos se ponen en cola implícitamente, por lo que terminan en el bucle de eventos (así como conexiones explícitas en cola también, obviamente).

Lo hemos hecho para atrapar e informar excepciones en nuestros controladores de eventos, por lo que realmente todos los eventos pasan por allí.

Solo una idea.

Macke
fuente
Esa es una idea encantadora! No estoy acostumbrado a un entorno QT, ya que he hecho la mayor parte de mi trabajo con pyGTK aquí. ¡Gracias!
Jake Kurzer
¿Tiene una forma recomendada de obtener y resolver la naturaleza de las señales dadas?
Jake Kurzer
Solo lo hice para señales con QStateMachine :: SignalEvent, que no parece ser lo mismo. La fuente aún debe ser el QObject* objectparámetro. Quizás MetaCall es el tipo para todas las señales (parece probable), pero no estoy seguro. Esto va un poco más allá de mi experiencia, pero echar un vistazo a la fuente Qt podría obtener algo de verdad. (O, haga una pregunta más puntual wrt en cola invocaciones de señal aquí en SO .. :)
Macke
2

Editar: Ahora veo que mencionaste esto en tu primera publicación. Maldición, nunca pensé que sería ese tipo.

Puede usar Pin para instrumentar su código con una granularidad más fina. Creo que Pin te permitiría crear una herramienta para contar cuántas veces ingresas a una función o cuántas veces pasas allí, emulando algo como VTune o CodeAnalyst. Luego, puede desglosar qué funciones se instrumentan hasta que desaparezcan sus problemas de sincronización.

Aaron Altman
fuente
En realidad, el PIN fue lo primero que busqué. En realidad, hay algo llamado PIN Play que sería perfecto, pero no es para su lanzamiento fuera de Intel. No estoy seguro de recordar lo suficiente sobre el uso del PIN para armar algo realmente bueno, pero ...
Jake Kurzer
2

Te puedo decir lo que uso todos los días.

a) Analista de código AMD

  • Es fácil y le dará una visión general rápida de lo que está sucediendo. Estará bien la mayor parte del tiempo.
  • Con las CPU AMD, le informará sobre la tubería de la CPU, pero solo necesita esto si tiene bucles pesados, como en motores gráficos, códecs de video, etc.

b) VTune.

  • Está muy bien integrado en vs2008

  • Después de conocer los puntos de acceso, necesita muestrear no solo el tiempo, sino otras cosas como la falta de caché y el uso de memoria. Esto es muy importante . Configure una sesión de muestreo y edite las propiedades. Siempre muestro por tiempo, memoria de lectura / escritura y errores de caché (tres ejecuciones diferentes)

Pero más que la herramienta, necesita obtener experiencia con la creación de perfiles. Y eso significa comprender cómo funciona la CPU / Memoria / PCI ... así que esta es mi tercera opción

c) Prueba unitaria

Esto es muy importante si está desarrollando una gran aplicación que necesita un gran rendimiento. Si no puede dividir la aplicación en algunas partes, será difícil rastrear el uso de la CPU. No pruebo todos los casos y clases, pero he codificado ejecuciones y archivos de entrada con características importantes.

Mi consejo es utilizar un muestreo aleatorio en varias pruebas pequeñas y tratar de estandarizar una estrategia de perfil.

Javier Loureiro
fuente
AMD Code Analyst es inestable en mi entorno de desarrollo y VTune explícitamente no lo admite. : S
Jake Kurzer
2

Uso xperf / ETW para todas mis necesidades de creación de perfiles. Tiene una curva de aprendizaje empinada pero es increíblemente poderosa. Si está perfilando en Windows, entonces debe conocer xperf. Con frecuencia utilizo este generador de perfiles para encontrar problemas de rendimiento en mi código y en el código de otras personas.

En la configuración que lo uso:

  • xperf toma muestras de CPU de cada núcleo que ejecuta código cada ms. La frecuencia de muestreo se puede aumentar a 8 KHz y las muestras incluyen el modo de usuario y el código del núcleo. Esto permite descubrir qué hace un hilo mientras se está ejecutando
  • xperf registra cada cambio de contexto (lo que permite una reconstrucción perfecta de la cantidad de tiempo que usa cada subproceso), además de las pilas de llamadas para cuando se conectan los subprocesos, más las pilas de llamadas para qué hilo preparó otro hilo, permitiendo el seguimiento de las cadenas de espera y descubriendo por qué un hilo no está funcionando
  • xperf registra todas las E / S de archivos de todos los procesos
  • xperf registra todas las E / S de disco de todos los procesos
  • xperf registra qué ventana está activa, la frecuencia de la CPU, el estado de la alimentación de la CPU, los retrasos de la interfaz de usuario, etc.
  • xperf también puede registrar todas las asignaciones de almacenamiento dinámico de un proceso, todas las asignaciones virtuales de todos los procesos y mucho más.

Esa es una gran cantidad de datos, todos en una sola línea de tiempo, para todos los procesos. Ningún otro generador de perfiles en Windows puede hacer eso.

He blogueado extensamente sobre cómo usar xperf / ETW. Estas publicaciones de blog y algunos videos de capacitación de calidad profesional se pueden encontrar aquí: http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

Si desea saber qué podría pasar si no usa xperf, lea estas publicaciones de blog: http://randomascii.wordpress.com/category/investigative-reporting/ Estas son historias de problemas de rendimiento que he encontrado en el código de otras personas , eso debería haber sido encontrado por los desarrolladores. Esto incluye la carga de mshtml.dll en el compilador de VC ++, una denegación de servicio en los archivos de búsqueda de VC ++, estrangulación térmica en un sorprendente número de máquinas de clientes, paso lento lento en Visual Studio, una asignación de 4 GB en un disco duro. controlador de disco, un error de rendimiento de powerpoint y más.

Bruce Dawson
fuente
1

Acabo de terminar la primera versión utilizable de CxxProf , una biblioteca de perfiles instrumentada manual portátil para C ++.

Cumple los siguientes objetivos:

  • Integración fácil
  • Elimine fácilmente la lib durante el tiempo de compilación
  • Elimina fácilmente la lib durante el tiempo de ejecución
  • Soporte para aplicaciones multiproceso
  • Soporte para sistemas distribuidos.
  • Mantenga el impacto al mínimo

Estos puntos fueron extraídos de la wiki del proyecto , eche un vistazo allí para obtener más detalles.

Descargo de responsabilidad: soy el desarrollador principal de CxxProf

MOnsDaR
fuente
1

Solo para descartarlo, a pesar de que no es un perfilador completo: si todo lo que busca es colgar bucles de eventos que demoran mucho en procesar un evento, una herramienta ad-hoc es simple en Qt. Ese enfoque podría ampliarse fácilmente para realizar un seguimiento de cuánto tiempo tomó procesar cada evento, y cuáles fueron esos eventos, y así sucesivamente. No es un perfilador universal, sino un evento centrado en el bucle.

En Qt, todas las llamadas de ranura de señal entre hilos se entregan a través del bucle de eventos, al igual que los temporizadores, las notificaciones de red y puerto serie, y toda la interacción del usuario. Por lo tanto, observar los bucles de eventos es un gran paso hacia la comprensión de dónde la aplicación pasa su tiempo.

Kuba Ober
fuente
0

DevPartner, desarrollado originalmente por NuMega y ahora distribuido por MicroFocus, fue una vez la solución elegida para la creación de perfiles y el análisis de código (fugas de memoria y recursos, por ejemplo). No lo he probado recientemente, por lo que no puedo asegurarle que lo ayudará; pero una vez tuve excelentes resultados con él, por lo que esta es una alternativa que considero reinstalar en nuestro proceso de calidad de código (proporcionan una prueba de 14 días)

Pascal T.
fuente
0

aunque su sistema operativo es win7, ¿el programa no puede ejecutarse en xp? ¿Qué tal si lo perfilamos bajo XP y el resultado debería ser una pista para win7?

usuario541633
fuente
Ciertamente, podría, pero eso requeriría comprar una licencia para un producto que tal vez nunca respalde bien su entorno de desarrollo deseado, o que pueda llevar años hacerlo. 1.5k es mucho dinero para apostar, más los costos en tiempo de imágenes e implementación de una caja xp.
Jake Kurzer
0

Aquí se enumeran muchos perfiladores y he probado algunos de ellos, sin embargo, terminé escribiendo el mío en base a esto:

http://code.google.com/p/high-performance-cplusplus-profiler/

Por supuesto, requiere que modifique la base del código, pero es perfecto para reducir los cuellos de botella, debería funcionar en todos los x86 (podría ser un problema con las cajas multinúcleo, es decir, utiliza rdtsc, sin embargo, esto es solo para el tiempo indicativo de todos modos - así que creo que es suficiente para mis necesidades ...)

Nim
fuente