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:
Construye la aplicación con configuraciones para generar información de perfiles.
Generar información de perfil ejecutando la aplicación construida
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
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:
- Instalar Google Perf Tools
- Compila tu código como siempre
- Agregue la biblioteca de perfiles de
libprofiler
a la ruta de carga de su biblioteca en tiempo de ejecución - 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