¿Cuál es un buen generador de perfiles fácil de usar para C ++ en Linux? [cerrado]


79

Necesito perfilar algún código que ejecute C ++ en Linux. ¿Pueden recomendar algunos perfiladores?


1
Debe agregar etiquetas de Linux y C ++. Probablemente obtendrá una mejor respuesta y variedad de opiniones.
Duck


por ejemplo: likwid, LLTng, oprofile, valgrind, vtune, gprof, perf, gperftools, pTop
Shan

Vea esta pregunta en slant: slant.co/improve/topics/1005
ideasman42

Respuestas:


37

Utilice gprof.

Simplemente compile con -pgflag (creo (pero no estoy seguro) que debe desactivar las optimizaciones) y use gprof para analizar el archivo gmon.out que su ejecutable producirá.

p.ej:

gcc -pg -o whatever whatever.c

./whatever

gprof whatever gmon.out

Lo mismo ocurre con g ++ y cpp.


32
Crear perfiles de código no optimizado es un poco inútil, ¿no? De manera similar, el código de generación de perfiles que se ha modificado en gran medida con -pg a menudo lo lleva a optimizar los puntos equivocados.
federal

1
-pg es una opción de enlazador, no un compilador
Slug Pue

24

valgrind es un perfilador de Linux muy conocido


valgrind pensamiento era más para la verificación de fugas de memoria .. Estoy tratando de ver qué funciones están siendo llamados etc
Shergill

14
utilizar la herramienta de la suite llamada "callgrind"
dfa

2
Valgrind es simplemente un marco para crear herramientas dinámicas. Aunque, se ha convertido en sinónimo de Memcheck, una herramienta construida sobre Valgrind. Callgrind es un generador de perfiles bastante bueno.
Falaina


13

Zoom de RotateRight ( http://www.rotateright.com ) es lo que he estado usando. Tiene una vista de mariposa de funciones y puede hacer doble clic en cualquier función para sumergirse en el código fuente o asm. Compile con información de depuración (-g) para ver su fuente, pero aún debe compilar y perfilar el código optimizado .


1
Acabo de darle una oportunidad a este programa, ¡es realmente agradable! Actualmente es mi generador de perfiles favorito en Linux; sin embargo, vale la pena mencionar que requiere que se compile código para crear -fno-omit-frame-pointerun perfil de manera efectiva.
Nik Reiman

1
El vínculo parece muerto. ¿Alguien sabe dónde (o si) se puede encontrar en otro lugar?
Simon F

12

Soy fanático de Oprofile . Implica instalar un módulo del kernel y tiene una pequeña curva de aprendizaje, pero es bastante poderoso y funciona muy bien para programas / programas optimizados sin símbolos de depuración.

Vtune es otro generador de perfiles muy potente creado por Intel. Creo que la versión de Linux es gratuita para software no comercial.

También está el conjunto de herramientas Valgrind propuesto por dfa. Callgrind probablemente sea lo que más le interese. Cachegrind (cuyo conjunto de características es un subconjunto del de Callgrind) y Massif también son interesantes, pero no tengo experiencia con este último.


+1 para oprofile, que no es una "herramienta fácil"
dfa

1
Jaja cierto. Probablemente no debería hacer que eso suene tan fácil :) Ciertamente no es tan simple como "ejecutar un programa debajo de él" como las herramientas Vtune y Valgrind, pero siento que te acostumbras bastante rápido.
Falaina

oprofile parece interesante: ¿es compatible con x86_64?
LiraNuna

VTune no es gratuito para ningún uso, desafortunadamente.
rustyx



2

gprof es la herramienta GNU estándar para la creación de perfiles.


2

Eche un vistazo a Sysprof . Es muy probable que su distribución ya lo tenga disponible.

Tenga en cuenta que todos los perfiladores mencionados funcionan mejor si su aplicación está compilada con punteros de marco. Es decir, debe usar -fno-omit-frame-pointer en la línea de comando gcc.


1

basará su juicio sobre el cuello de botella en 10 muestras que recolecte manualmente, en lugar de 1000 muestras recolectadas por prof.
Dmitry Grigoryev hace

1
@DmitryGrigoryev: Correcto, y eso realmente te dice lo que debes arreglar. La explicación estadística está aquí . De hecho, el primer error que cometen las personas es pensar que están buscando un "cuello de botella" en lugar de un código perfectamente bueno pero derrochador ;-)
Mike Dunlavey

Buena lectura, gracias. Estoy totalmente de acuerdo con su punto de que optimizar es mucho más fácil cuando ve una llamada de función real en el depurador. Y entiendo que "cuello de botella" no significa "buen objetivo de optimización", solo uno potencial. Aún así, creo que tiene sentido comenzar de proftodos modos: si veo que f()es la función más problemática estadísticamente, detendré el programa varias veces hasta que aterrice en f()lugar de comenzar con una función aleatoria en la que paré primero.
Dmitry Grigoryev
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.