Compartir a través de


Generar perfiles con la API de ELT

Los perfiles de traza registran las entradas y salidas en funciones, y también pueden mantener gráficos de historial de llamadas. Para ayudar a implementar esta funcionalidad, .NET Framework proporciona las funciones estáticas globales de generación de perfiles, que contienen conjuntos de funciones e interfaces relacionadas, conocidas como las API enter/leave/tailcall (ELT).

Antes de .NET Framework versión 4, los generadores de perfiles de traza que usaban funciones ELT pagaban un precio de rendimiento que crecía a medida que aumentaba el número de pequeñas funciones administradas. A partir de .NET Framework 4, se puede usar la versión 3 de la API ELT (ELT3) para obtener mejoras de rendimiento de ELT, especialmente cuando no hay necesidad de inspeccionar los argumentos o el valor devuelto. Entre las mejoras de rendimiento se incluyen:

  • El tamaño del código compilado Just-In-Time disminuye para funciones de acceso rápido de ELT.

  • El número de argumentos de ELT necesarios se reduce a un mínimo, con lo que disminuyen los requisitos de espacio de pila para los parámetros que se pasan al generador de perfiles.

  • La configuración del marco de pila y la inspección de argumentos solo se lleva a cabo cuando se necesita, lo que aumenta la velocidad de ejecución.

  • La información del marco y los argumentos se inicializa de forma diferida cuando se llama a un nuevo método ICorProfilerInfo3.

Las interfaces de ELT3 son compatibles con las interfaces de ELT (ELT1 y ELT2) de versiones anteriores de .NET Framework.

.NET Framework 4 implementa las funciones de ELT2 sobre ELT3 y utiliza una tabla hash adicional para asignar identificadores de cliente e identificadores de función. Esto hace que el costo de sincronización sea alto y la generación de perfiles lenta cuando se usan las funciones de ELT2. La degradación del rendimiento es incluso peor en los equipos multiprocesador muy cargados. Sin embargo, los cambios de código necesarios para migrar un generador de perfiles a las API ELT3 son directos y baratos, por lo que se recomienda adoptar ELT3 para obtener el máximo rendimiento.

Funciones y métodos de ELT3

La API de ELT3 proporciona tres tipos de miembros:

  • Funciones de notificación, a las que llama el CLR para notificar a un generador de perfiles que se está pasando el control a una función en la aplicación de destino.

  • Métodos de registro, a los que llama el generador de perfiles para habilitar los métodos de inspección de acceso rápido o lento.

  • Métodos de inspección, a los que llama el generador de perfiles para recuperar información de argumentos o de valor devuelto.

Funciones de notificación de ELT3

A partir de .NET Framework 4, puede utilizar tres de las seis funciones de notificación de ELT3 para notificar al generador de perfiles que el control se pasa a una función en la aplicación de destino (la aplicación de la que se generan perfiles). Las funciones de notificación de ELT3 se dividen en funciones de acceso rápido y funciones de acceso lento:

  • Las funciones de acceso rápido se caracterizan por código compilado JIT que llama directamente a los métodos de ELT del generador de perfiles sin necesidad de utilizar código intermediario.

  • Las funciones de acceso lento se caracterizan por código compilado JIT que llama a un intermediario (normalmente una combinación de código de ensamblado y código C que se compila en la DLL de CLR) antes de llamar a los métodos de ELT del generador de perfiles.

Las tres funciones siguientes son de acceso rápido y requieren un solo parámetro, el identificador de la función a la que se pasa o se devuelve el control, o que está a punto de hacer una llamada de cola:

Las tres funciones siguientes son funciones de acceso lento y requieren dos parámetros, el identificador de función y un identificador de información sobre un marco de pila:

En estas tres funciones, el segundo parámetro (eltInfo) que el runtime pasa al generador de perfiles es un puntero opaco a una estructura _COR_PRF_ELT_INFO_INTERNAL que se asigna en la pila. Esta estructura contiene el identificador específico de la plataforma generado por las aplicaciones auxiliares del ensamblado de ELT. El generador de perfiles puede utilizar el puntero eltInfo en los métodos ICorProfilerInfo3::GetFunctionEnter3Info, ICorProfilerInfo3::GetFunctionLeave3Info e ICorProfilerInfo3::GetFunctionTailcall3Info.

Método de registro de ELT3

Puede utilizar los dos métodos siguientes de registro de ELT3 para configurar funciones de ELT de acceso lento y acceso rápido:

Se debe llamar a uno de estos métodos cuando la aplicación se inicia, desde la devolución de llamada ICorProfilerCallback::Initialize o ICorProfilerCallback3::InitializeForAttach del generador de perfiles. El generador de perfiles tiene que registrar la marca de evento deseada con SetEventMask antes de llamar al método SetEnterLeaveFunctionHooks3 para habilitar ELT3 de acceso rápido o al método SetEnterLeaveFunctionHooks3WithInfo para habilitar ELT3 de acceso lento.

Los enlaces de ELT3 de acceso rápido no se pueden mezclar con los de acceso lento. Por otra parte, los enlaces de ELT3 no se pueden utilizar con enlaces de ELT1 o ELT2. Si el generador de perfiles no ha especificado marcas de evento adecuadas que requieren acceso lento (COR_PRF_ENABLE_FUNCTION_ARGS, COR_PRF_ENABLE_FUNCTION_RETVAL o COR_PRF_ENABLE_FRAME_INFO) antes de la llamada a SetEnterLeaveFunctionHooks3 o SetEnterLeaveFunctionHooks3WithInfo, se devuelve el código de error CORPROF_E_INCONSISTENT_WITH_FLAGS para indicar el error.

Métodos de inspección de ELT3

Las funciones de notificación de ELT3 no proporcionan información de argumentos ni del valor devuelto; por consiguiente, el generador de perfiles debe solicitar la información explícitamente llamando a uno de los siguientes métodos de inspección ICorProfilerInfo3:

Se debe llamar a estos métodos desde la implementación del generador de perfiles de la función de acceso lento de ELT3 correspondiente (FunctionEnter3WithInfo, FunctionLeave3WithInfo y FunctionTailcall3WithInfo) y el generador de perfiles tiene que proporcionar el mismo valor eltInfo que recibió de la función de notificación de ELT. Hay que tener en cuenta que no se puede llamar a los métodos de inspección de ELT3 desde la implementación del generador de perfiles de una función de notificación de acceso rápido de ELT3 (FunctionEnter3, FunctionLeave3, FunctionTailcall3) ni desde ninguna función de notificación de ELT2 o ELT1.

Vea también

Conceptos

Información general sobre la generación de perfiles

Otros recursos

Generación de perfiles (Referencia de la API no administrada)

Referencia de la API no administrada