Buscar..


Perfilando con gcc y gprof

El perfilador gprof de GNU, gprof , le permite crear un perfil de su código. Para usarlo, necesitas realizar los siguientes pasos:

  1. Construye la aplicación con configuraciones para generar información de perfiles.

  2. Generar información de perfil ejecutando la aplicación construida

  3. Ver la información de perfil generada con gprof

Para construir la aplicación con configuraciones para generar información de perfiles, agregamos la -pg . Así, por ejemplo, podríamos usar

$ gcc -pg *.cpp -o app

o

$ gcc -O2 -pg *.cpp -o app

Etcétera.

Una vez que la aplicación, por ejemplo app , es construido, ejecutarlo como de costumbre:

$ ./app

Esto debería producir un archivo llamado gmon.out .

Para ver los resultados del perfil, ahora ejecute

$ gprof app gmon.out

(tenga en cuenta que proporcionamos tanto la aplicación como la salida generada).

Por supuesto, también puede canalizar o redirigir:

$ gprof app gmon.out | less

Etcétera.

El resultado del último comando debe ser una tabla, cuyas filas son las funciones y cuyas columnas indican el número de llamadas, el tiempo total empleado, el tiempo empleado (es decir, el tiempo empleado en la función, excluyendo las llamadas a los hijos).

Generando diagramas de callgraph con gperf2dot

Para aplicaciones más complejas, los perfiles de ejecución planos pueden ser difíciles de seguir. Esta es la razón por la que muchas herramientas de creación de perfiles también generan algún tipo de información anotada del gráfico de llamadas.

gperf2dot convierte la salida de texto de muchos perfiladores (Linux perf, callgrind, oprofile, etc.) en un diagrama de callgraph. Puede usarlo ejecutando su generador de perfiles (ejemplo para gprof ):

# compile with profiling flags  
g++ *.cpp -pg
# run to generate profiling data                                            
./main
# translate profiling data to text, create image     
gprof ./main | gprof2dot -s | dot -Tpng -o output.png

introduzca la descripción de la imagen aquí

Perfilando el uso de la CPU con gcc y Google Perf Tools

Google Perf Tools también proporciona un perfilador de CPU, con una interfaz un poco más amigable. Para usarlo:

  1. Instalar Google Perf Tools
  2. Compila tu código como siempre
  3. Agregue la biblioteca de perfiles de libprofiler a la ruta de carga de su biblioteca en tiempo de ejecución
  4. Utilice pprof para generar un perfil de ejecución plano o un diagrama de callgraph

Por ejemplo:

# compile code
g++ -O3 -std=c++11 main.cpp -o main

# run with profiler
LD_PRELOAD=/usr/local/lib/libprofiler.so CPUPROFILE=main.prof CPUPROFILE_FREQUENCY=100000 ./main

dónde:

  • CPUPROFILE indica el archivo de salida para el perfil de datos
  • CPUPROFILE_FREQUENCY indica la frecuencia de muestreo del generador de perfiles;

Utilice pprof para postprocesar los datos del perfil.

Puede generar un perfil de llamada plana como texto:

$ pprof --text ./main main.prof
PROFILE: interrupts/evictions/bytes = 67/15/2016
pprof --text --lines ./main main.prof
Using local file ./main.
Using local file main.prof.
Total: 67 samples
      22  32.8%  32.8%       67 100.0% longRunningFoo ??:0
      20  29.9%  62.7%       20  29.9% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1627
       4   6.0%  68.7%        4   6.0% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1619
       3   4.5%  73.1%        3   4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:388
       3   4.5%  77.6%        3   4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:401
       2   3.0%  80.6%        2   3.0% __munmap /build/eglibc-3GlaMS/eglibc-2.19/misc/../sysdeps/unix/syscall-template.S:81
       2   3.0%  83.6%       12  17.9% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:298
       2   3.0%  86.6%        2   3.0% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:385
       2   3.0%  89.6%        2   3.0% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:26
       1   1.5%  91.0%        1   1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1617
       1   1.5%  92.5%        1   1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1623
       1   1.5%  94.0%        1   1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:293
       1   1.5%  95.5%        1   1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:296
       1   1.5%  97.0%        1   1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:371
       1   1.5%  98.5%        1   1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:381
       1   1.5% 100.0%        1   1.5% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:28
       0   0.0% 100.0%       67 100.0% __libc_start_main /build/eglibc-3GlaMS/eglibc-2.19/csu/libc-start.c:287
       0   0.0% 100.0%       67 100.0% _start ??:0
       0   0.0% 100.0%       67 100.0% main ??:0
       0   0.0% 100.0%       14  20.9% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:27
       0   0.0% 100.0%       27  40.3% std::vector::_M_emplace_back_aux ??:0

... o puede generar un gráfico de llamadas anotado en un pdf con:

pprof --pdf ./main main.prof > out.pdf


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow