Hasta ahora, solo he usado Rational Quantify. Escuché cosas maravillosas sobre VTune de Intel, ¡pero nunca lo probé!
Editar: principalmente estoy buscando software que instrumente el código, ya que supongo que esa es la única forma de obtener resultados muy buenos.
Ver también:
¿Cuáles son algunos buenos perfiladores para C ++ nativo en Windows?
c++
performance
profiling
OysterD
fuente
fuente
Respuestas:
Para el desarrollo de Linux (aunque algunas de estas herramientas pueden funcionar en otras plataformas). Estos son los dos grandes nombres que conozco, hay muchos otros más pequeños que no han visto un desarrollo activo en un tiempo.
fuente
Para Linux: Google Perftools
fuente
En mi humilde opinión, el muestreo con un depurador es el mejor método. Todo lo que necesita es un IDE o un depurador que le permita detener el programa. Clava sus problemas de rendimiento incluso antes de que instale el generador de perfiles.
fuente
Mi única experiencia en la creación de perfiles de código C ++ es con AQTime de AutomatedQA (ahora SmartBear Software). Tiene varios tipos de perfiladores integrados (rendimiento, memoria, identificadores de Windows, rastreo de excepciones, análisis estático, etc.) e instrumenta el código para obtener los resultados.
Disfruté usándolo, siempre fue divertido encontrar esos lugares donde un pequeño cambio en el código podría hacer una mejora dramática en el rendimiento.
fuente
Nunca antes había hecho perfiles. Ayer programé una clase ProfilingTimer con un horario estático (un mapa <std :: string, long long>) para el almacenamiento de tiempo.
El constructor almacena la marca inicial y el destructor calcula el tiempo transcurrido y lo agrega al mapa:
ProfilingTimer::ProfilingTimer(std::string name) : mLocalName(name) { sNestedName += mLocalName; sNestedName += " > "; if(sTimetable.find(sNestedName) == sTimetable.end()) sTimetable[sNestedName] = 0; mStartTick = Platform::GetTimerTicks(); } ProfilingTimer::~ProfilingTimer() { long long totalTicks = Platform::GetTimerTicks() - mStartTick; sTimetable[sNestedName] += totalTicks; sNestedName.erase(sNestedName.length() - mLocalName.length() - 3); }
En cada función (o {bloque}) que quiero perfilar, necesito agregar:
ProfilingTimer _ProfilingTimer("identifier");
Esta línea es un poco engorrosa de agregar en todas las funciones que quiero perfilar, ya que tengo que adivinar qué funciones toman mucho tiempo. Pero funciona bien y la función de impresión muestra el tiempo consumido en%.
(¿Alguien más está trabajando con algún "perfil casero" similar? ¿O es simplemente estúpido? ¡Pero es divertido! ¿Alguien tiene sugerencias de mejora?
¿Existe algún tipo de adición automática de una línea a todas las funciones?)
fuente
He usado Glowcode ampliamente en el pasado y no he tenido más que experiencias positivas con él. Su integración con Visual Studio es realmente agradable y es el generador de perfiles más eficiente / intuitivo que he usado (incluso en comparación con los generadores de perfiles para código administrado).
Obviamente, eso es inútil si no se está ejecutando en Windows, pero la pregunta no me deja claro cuáles son exactamente sus requisitos.
fuente
oprofile, sin duda; es simple, confiable, funciona y puede brindar todo tipo de desgloses agradables de datos.
fuente
El generador de perfiles de Visual Studio 2008 es muy bueno: rápido, fácil de usar, claro y bien integrado en el IDE.
fuente
Para Windows, consulte Xperf . Utiliza un perfil muestreado, tiene una interfaz de usuario útil y no requiere instrumentación. Muy útil para rastrear problemas de rendimiento. Puede responder preguntas como:
Se sorprenderá bastante cuando encuentre los cuellos de botella, ¡ya que probablemente no estén donde esperaba!
fuente
Existen diferentes requisitos para la elaboración de perfiles. ¿Está bien el código instrumentado o necesita perfilar el código optimizado (o incluso el código ya compilado)? ¿Necesita información de perfil línea por línea? ¿Qué sistema operativo estás ejecutando? ¿Necesita también crear perfiles de bibliotecas compartidas? ¿Qué pasa con el rastreo en las llamadas al sistema?
Personalmente, utilizo oprofile para todo lo que hago, pero puede que no sea la mejor opción en todos los casos. Vtune y Shark también son excelentes.
fuente
Como no menciona la plataforma en la que está trabajando, diré cachegrind en Linux. Seguro. Es parte del conjunto de herramientas Valgrind.
http://valgrind.org/info/tools.html
Nunca he usado su subfunción Callgrind, ya que la mayor parte de la optimización de mi código es para funciones internas .
Tenga en cuenta que hay una interfaz KCachegrind disponible.
fuente
Para el desarrollo de Windows, he estado usando el Validador de rendimiento de Verificación de software : es rápido, razonablemente preciso y tiene un precio razonable. Lo mejor de todo es que puede instrumentar un proceso en ejecución y le permite activar y desactivar la recopilación de datos en tiempo de ejecución, tanto manualmente como en función de la pila de llamadas, lo que es ideal para crear perfiles de una pequeña sección de un programa más grande.
fuente
Para Windows, probé AMD Codeanalyst, Intel VTune y el generador de perfiles en Visual Studio Team Edition.
Codeanalyst tiene errores (se bloquea con frecuencia) y en mi código, sus resultados a menudo son inexactos. Su interfaz de usuario no es intuitiva. Por ejemplo, para llegar a la pantalla de la pila de llamadas en los resultados del perfil, debe hacer clic en la pestaña "Procesos", luego hacer clic en el nombre de archivo EXE de su programa, luego hacer clic en un botón de la barra de herramientas con las letras minúsculas "CSS". Pero es un programa gratuito, por lo que también puede probarlo y funciona (con menos funciones) sin un procesador AMD.
VTune ($ 700) tiene una interfaz de usuario terrible en mi opinión ; en un programa grande, es difícil encontrar el árbol de llamadas particular que desea, y solo puede mirar un "nodo" en un programa a la vez (una función con sus llamadores y destinatarios inmediatos); no puede ver un árbol de llamadas. Hay una vista de gráfico de llamadas, pero no pude encontrar una manera de hacer que los tiempos de ejecución relativos aparezcan en el gráfico. En otras palabras, las funciones en el gráfico se ven iguales independientemente de cuánto tiempo se dedicó a ellas; es como si hubieran perdido totalmente el sentido de la creación de perfiles.
El generador de perfiles de Visual Studio tiene la mejor GUI de los tres, pero por alguna razón no puede recopilar muestras de la mayoría de mi código (las muestras solo se recopilan para algunas funciones en todo mi programa C ++). Además, no pude encontrar un precio o una forma de comprarlo directamente; pero viene con la suscripción a MSDN de mi empresa. Visual Studio admite código administrado, nativo y mixto; No estoy seguro de los otros dos perfiladores en ese sentido.
En conclusión, ¡todavía no conozco un buen perfilador! Me aseguraré de revisar las otras sugerencias aquí.
fuente
Utilizo devpartner para la plataforma de PC.
fuente
Probé Quantify an AQTime, y Quantify ganó debido a sus invaluables funciones de 'enfoque en subárbol' y 'eliminar subárbol'.
fuente
La única respuesta sensible es PTU de Intel. Por supuesto, es mejor usarlo en un procesador Intel y obtener resultados aún más valiosos al menos en una máquina C2D, ya que la arquitectura en sí es más fácil de devolver perfiles significativos.
fuente
He usado VTune en Windows y Linux durante muchos años con muy buenos resultados. Las versiones posteriores han empeorado, cuando subcontrataron ese producto a su equipo de desarrollo ruso, la calidad y el rendimiento disminuyeron (aumentaron las fallas de VTune, a menudo más de 15 minutos para abrir un archivo de análisis).
En cuanto a la instrumentación, es posible que descubra que es menos útil de lo que cree. En el tipo de aplicaciones en las que he trabajado para agregar instrumentación, a menudo el producto ralentiza tanto que ya no funciona (historia real: iniciar la aplicación, volver a casa, volver al día siguiente, la aplicación aún se está inicializando). Además, con la creación de perfiles no instrumentados, puede reaccionar ante problemas en vivo. Por ejemplo, con el recopilador de fechas remoto VTune puedo iniciar una sesión de muestreo en un servidor en vivo con cientos de conexiones simultáneas que están experimentando problemas de rendimiento y detectar problemas que ocurren en producción que nunca podría replicar en un entorno de prueba.
fuente
ElectricFence funciona muy bien para la depuración de malloc
fuente
Mi herramienta favorita es Easy Profiler: http://code.google.com/p/easyprofiler/
Es un generador de perfiles de tiempo de compilación: el código fuente debe instrumentarse manualmente utilizando un conjunto de rutinas para describir las regiones de destino. Sin embargo, una vez que se ejecuta la aplicación y las medidas se escriben automáticamente en un archivo XML, solo es cuestión de abrir la aplicación Observer y hacer unos pocos clics en las herramientas de análisis / comparación, antes de que pueda ver el resultado en un gráfico cualitativo.
fuente
Profiler de Visual Studio 2010 en Windows. VTune tenía una excelente herramienta de gráficos de llamadas, pero se rompió a partir de Windows Vista / 7. No sé si lo arreglaron.
fuente
Permítanme dar un enchufe para EQATEC ... justo lo que estaba buscando ... fácil de aprender y usar y me brinda la información que necesito para encontrar los puntos de acceso rápidamente. Lo prefiero al que está integrado en Visual Studio (aunque todavía no he probado el VS 2010, para ser justos).
La capacidad de tomar instantáneas es ENORME. A menudo obtengo un análisis y una optimización adicionales mientras espero que se ejecute el análisis de destino real ... me encanta.
¡Ah, y su versión básica es gratuita!
http://www.eqatec.com/Profiler/
fuente