es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , , ,

Answer

  1. Avatar for 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:

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-inline-functions")
    

    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 de perf. Esto puede darle una mejor idea de qué funciones se están llamando, incluso si están inlineadas. Para utilizar g++filt, simplemente redirija la salida de perf a través de ella:

    perf report | c++filt
    

    Esto reemplazará los nombres de función enmascarados con sus versiones desenmascaradas.

Comments are closed.