Criação de perfil com a API ELT
Função de log de geradores de perfis de rastreamento entra e sai e também pode manter os gráficos históricos de chamada. Para ajudar a implementar essa funcionalidade, o.NET Framework fornece a a criação de perfil globais funções estáticas, que contenham conjuntos de funções relacionadas e interfaces, conhecidos como o enter/deixar/tailcall (ELT) APIs.
Antes de .NET Framework versão 4, geradores de perfis de rastreamento usados funções ELT pago um custo de desempenho aumentado conforme o número de pequenas funções gerenciadas que aumentou. Começando com o .NET Framework 4, você pode usar a versão 3 (ELT3) de ELT API para melhorias de desempenho ELT, especialmente quando não há nenhuma necessidade de argumento ou retorno de valor da inspeção. Melhorias de desempenho incluem o seguinte:
O tamanho do just-in-time compilado diminui de código para funções de caminho de fast ELT.
O número de argumentos ELT necessários é reduzido ao mínimo, o que diminui os requisitos de espaço de pilha para os parâmetros são passados para o profiler.
Inspeção de instalação e o argumento de quadro de pilha ocorre somente quando forem necessários, o que aumenta a velocidade de execução.
Informações do quadro e o argumento ociosamente são inicializadas quando um novo ICorProfilerInfo3 método é chamado.
Interfaces de ELT3 são compatíveis com as interfaces ELT (ELT1 e ELT2) em versões anteriores do.NET Framework.
O .NET Framework 4 implementa as funções de ELT2 de ELT3 e usa uma tabela de hash extra para mapear entre o cliente, IDs e IDs de função. Isso resulta em sincronização significativas de custo e a criação de perfil lento ao usar as funções ELT2. Degradação do desempenho é ainda pior em computadores com multiprocessador de muito carregados. Entretanto, as alterações de código que são necessárias para migrar um gerador de perfil ELT3 APIs são simples e de baixo custo, portanto, recomendamos que você adote ELT3 para o melhor desempenho.
ELT3 Funções e os métodos
A API ELT3 fornece três tipos de membros:
Funções de notificação, que são chamadas pelo CLR para notificar um gerador de perfil que está sendo passado o controle para uma função no aplicativo de destino.
Métodos de registro, que são chamados pelo profiler para habilitar qualquer um dos métodos de inspeção de caminho rápido ou lento de caminho.
Métodos de inspeção, que são chamados pelo profiler para recuperar argumento ou o valor de retorno de informações.
ELT3 Funções de notificação
Começando com o .NET Framework 4, você pode usar três de seis funções de notificação de ELT3 para notificar o criador de perfil que está sendo passado o controle para uma função no aplicativo de destino (o aplicativo que está sendo perfilado). As funções de notificação ELT3 consistem em funções de fast-caminho e funções de caminho lento:
Funções de caminho de Fast são caracterizadas por código compilado JIT que chama diretamente métodos ELT do criador de perfil sem qualquer código intermediário.
Funções de caminho lentos são caracterizadas pelo código compilado JIT que chama um intermediário (geralmente uma combinação de código de assembly e o código em c que é compilado para a DLL do CLR) antes de chamar métodos ELT do profiler eventualmente.
Estas três funções são funções de caminho de fast e exigem apenas um parâmetro, o identificador da função para qual controle está sendo passado ou retornado ou que está prestes a fazer um Laço de chamada:
Estas três funções são funções de caminho lenta e requerem dois parâmetros, o identificador da função e uma alça para informações sobre um quadro de pilha:
Em um desses três funções, o segundo parâmetro (eltInfo) que o tempo de execução passa para o profiler é um ponteiro opaco para uma estrutura _COR_PRF_ELT_INFO_INTERNAL que está alocado na pilha. Essa estrutura inclui a alça de específico da plataforma que é gerada pelo auxiliares ELT assembly. O profiler pode usar o eltInfo o ponteiro na ICorProfilerInfo3::GetFunctionEnter3Info, ICorProfilerInfo3::GetFunctionLeave3Info, e ICorProfilerInfo3::GetFunctionTailcall3Info métodos.
ELT3 Métodos de registro
Você pode usar a seguintes dois métodos de registro de ELT3 para definir o caminho lento e funções do caminho de fast ELT:
Um desses métodos deve ser chamado quando o aplicativo for iniciado, de que o profiler ICorProfilerCallback::Initialize ou ICorProfilerCallback3::InitializeForAttach retorno de chamada. O criador de perfil possui que registrar o sinalizador de evento desejado com SetEventMask antes de chamar qualquer um de SetEnterLeaveFunctionHooks3 método para ativar o caminho de fast ELT3 ou o SetEnterLeaveFunctionHooks3WithInfo método para ativar a ELT3 de caminho lento.
Ganchos do caminho de Fast ELT3 não podem ser misturados com ganchos de ELT3 de caminho lento e ganchos de ELT3 não podem ser usados com ELT1 ou ELT2 ganchos. Se o profiler não especificado antes de chamar os sinalizadores de evento apropriado que exigem um caminho lento (COR_PRF_ENABLE_FUNCTION_ARGS, COR_PRF_ENABLE_FUNCTION_RETVAL ou COR_PRF_ENABLE_FRAME_INFO) SetEnterLeaveFunctionHooks3 ou SetEnterLeaveFunctionHooks3WithInfo, o código de erro CORPROF_E_INCONSISTENT_WITH_FLAGS é retornado para indicar a falha.
ELT3 Métodos de inspeção
Funções de notificação de ELT3 não fornecer o argumento ou retornar informações de valor; Portanto, o profiler deve solicitar explicitamente quais informações devem chamando um dos seguintes ICorProfilerInfo3 métodos de inspeção:
Esses métodos devem ser chamados a implementação do criador de perfil da função de ELT3 de caminho lento correspondente (FunctionEnter3WithInfo, FunctionLeave3WithInfo, e FunctionTailcall3WithInfo), e o profiler tem que oferecer o mesmo eltInfo valor que ele recebeu da função de notificação de ELT. Observe que os métodos de inspeção de ELT3 não podem ser chamados a implementação do criador de perfil de uma função de notificação do caminho de fast ELT3 (FunctionEnter3, FunctionLeave3, FunctionTailcall3), ou de qualquer função de notificação ELT1 ou ELT2.
Consulte também
Conceitos
Visão geral de criação de perfil