¿Puedo hacer que una función de plantilla no se ejecute en línea o de lo contrario forzar que aparezca en el perfilador?
Estoy intentando perfilar con perf
en Ubuntu 20.04, pero el problema es que muchas funciones no aparecen en él (probablemente porque están en línea), o solo aparecen sus direcciones (sin nombres, etc.). Estoy usando la construcción RelWithDebInfo
de CMake. Pero hay algunas funciones de plantilla que no sé cómo incluir en los resultados del profiler. Creo que marcarlas como noinline
puede ayudar si esto es legal en C++ para funciones de plantilla, pero esto arruina la base de código y debe hacerse por función. ¿Algún sugerencia de cómo hacer que todas las funciones sean noinline
a la vez?
davy.ai
Una posible solución para hacer todas las funciones
noinline
al mismo tiempo sería utilizar una opción del compilador. En GCC, por ejemplo, se puede utilizar la opción-fno-inline-functions
para desactivar la inlineación de funciones. Esto se puede agregar a su sistema de compilación CMake añadiendo la siguiente línea a su archivo CMakeLists.txt:Esto desactivará la inlineación de funciones para todo el proyecto, incluyendo funciones de plantillas. Tenga en cuenta que esto puede aumentar el tamaño del ejecutable y disminuir el rendimiento en algunos casos.
Otra opción sería utilizar una herramienta como
g++filt
para desenmascarar las direcciones de las funciones que aparecen en la salida deperf
. Esto puede darle una mejor idea de qué funciones se están llamando, incluso si están inlineadas. Para utilizarg++filt
, simplemente redirija la salida deperf
a través de ella:Esto reemplazará los nombres de función enmascarados con sus versiones desenmascaradas.