¿Cuál es su herramienta de creación de perfiles favorita (para C ++) [cerrado]

83

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?

OysterD
fuente
¿Quieres 1) medir o quieres 2) encontrar aceleraciones? Si quiere 2 y cree que requiere 1, no es así. Para encontrar aceleraciones, no necesita "resultados muy finos". Si el programa pasa el 90% de su tiempo haciendo algo que podría eliminar si supiera lo que era, las muestras de pila se lo mostrarán 9 de cada 10 veces. Si observa 10 muestras, ¿le importa si ve ¿10, 9 u 8 veces? De cualquier manera, sabes lo que es . El porcentaje medido no importa.
Mike Dunlavey

Respuestas:

35

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.

Alabama.
fuente
28

Para Linux: Google Perftools

  • Más rápido que valgrind (sin embargo, no tan fino)
  • No necesita instrumentación de código
  • Buena salida gráfica (-> kcachegrind)
  • ¿Realiza perfiles de memoria, perfiles de cpu, verificación de fugas
Weidenrinde
fuente
9

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.

Mike Dunlavey
fuente
3
¡Si! Esto funciona muy bien para mí. No necesita instrumentación. No necesita ningún generador de perfiles, etc. instalado. En linux, puede usar gdb. El programa se ejecuta a toda velocidad. Presione ctrl-c para detener. escriba 'bt' para mostrar el stacktrace. Luego 'c' para continuar, luego ctrl-c nuevamente. ¡Funciona genial! Simplemente reduje mi tiempo de ejecución en un 20%, en un programa complejo, usando esta técnica. ¡Increíble!
Hugh Perkins
@HughPerkins: Gracias por su edición, y me alegro de que tenga éxito. (Apuesto a que puedes hacerlo mejor que el 20% :)
Mike Dunlavey
1
Sí, bajé el tiempo de iteración de 1200ms a 200ms, en unas pocas horas de trabajo, usando solo gdb + ctrl-c, para ubicar los puntos de acceso :-)
Hugh Perkins
@HughPerkins: Para mí, si estoy trabajando en mi propio código, es difícil saber cuándo dejar de intentarlo; parece que siempre puedo exprimirlo un poco más. Cuando estoy trabajando en el código de otra persona, puede haber un problema. No siempre puedo convencer al "propietario" del código para que solucione el problema, por lo que el proceso se detiene. Es un acertijo interesante.
Mike Dunlavey
Si solo desea lograr esto sin instrumentación, no necesita ni siquiera un depurador o IDE en Linux. Simplemente ejecute "pstack <pid>" para apilar la instrucción de seguimiento actual en ejecución. Es mucho más simple que lanzar un depurador y luego romper manualmente y luego buscar stacktrace.
Manish Sogi
7

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.

Matt Dillard
fuente
Eso solo funciona en Windows, desafortunadamente.
Bram
6

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?)

Moberg
fuente
5

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.

jsight
fuente
5

oprofile, sin duda; es simple, confiable, funciona y puede brindar todo tipo de desgloses agradables de datos.

Shikari oscuro
fuente
5

El generador de perfiles de Visual Studio 2008 es muy bueno: rápido, fácil de usar, claro y bien integrado en el IDE.

Dimitri C.
fuente
2
¿No está el generador de perfiles solo en la versión Team?
dwj
@dwj: No estoy seguro. Estoy usando Visual Studio Team System 2008 Development Edition.
Dimitri C.
Parece que solo está en la edición Team ( stackoverflow.com/questions/61669/… ) para versiones anteriores a 2010.
dwj
4

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:

  • ¿Quién usa más CPU? Profundice en el nombre de la función utilizando pilas de llamadas.
  • ¿Quién asigna más memoria?
  • ¿Quién realiza más consultas de registro?
  • ¿Escrituras en disco? etc.

Se sorprenderá bastante cuando encuentre los cuellos de botella, ¡ya que probablemente no estén donde esperaba!

user15071
fuente
3

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.

Louis Brandy
fuente
3

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.

rlerallut
fuente
3

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.

Shog9
fuente
3

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í.

Qwertie
fuente
3

Utilizo devpartner para la plataforma de PC.

EvilTeach
fuente
Instrumenta el código. Tiene cobertura de código y verificación de límites (instrumentado y no instrumentado)
EvilTeach
2

Probé Quantify an AQTime, y Quantify ganó debido a sus invaluables funciones de 'enfoque en subárbol' y 'eliminar subárbol'.

eli
fuente
Ack completo. Solo tenía que hacer algunos perfiles en una aplicación C ++, y esas fueron las características exactas que realmente me alegraron el día.
Enno
2

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.

Fabien Hure
fuente
2

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.

Don Neufeld
fuente
2

ElectricFence funciona muy bien para la depuración de malloc

Michael McCarty
fuente
1

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.

charfeddine.ahmed
fuente
1

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.

Descifrador
fuente
0

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/

Brian Kennedy
fuente