Geração de código na API de criação de perfil
Este tópico discute o fluxo de código para código nativo e como um gerador de perfil pode controlar a geração de código do Microsoft intermediate language (MSIL).
Automática Versus Manual geração de código
O MSIL de um.Assembly do NET Framework pode ser compilado para código nativo em uma destas duas maneiras:
Compilação manual: A ferramenta Native Image Generator (NGen. exe) pode ser usada para criar uma imagem nativa.
Compilação automática: O common language runtime (CLR) pode executar a compilação just-in-time (JIT) em tempo de execução.
NGen. exe e o compilador JIT fornecem os sinalizadores que controlam a geração de código.
Quando um assembly é carregado, o CLR primeiro procura uma imagem nativa para o assembly. Se ele não é possível localizar uma imagem nativa com o conjunto certo de sinalizadores de geração de código, o CLR será compilação JIT as funções no assembly como eles são necessários durante a execução. Mesmo quando uma imagem nativa é encontrada e carregado, o CLR pode compilação JIT algumas das funções no assembly.
Controle do Profiler sobre a geração de código
O profiler usa os sinalizadores na tabela a seguir para controlar a geração de código.
Sinalizador |
Efeito |
---|---|
COR_PRF_USE_PROFILE_IMAGES |
(Requer o.NET Framework versão 2.0). Faz com que a pesquisa de imagem nativa procurar imagens profiler aprimorado (ngen /profile). Se a pesquisa não conseguir localizar uma imagem nativa do profiler aprimorado para um determinado conjunto, o CLR será em vez disso, compilação JIT os métodos no assembly como eles são necessários. Não tem efeito no código compilado JIT. |
COR_PRF_DISABLE_INLINING |
Não tem efeito sobre a pesquisa de imagem nativa. Na compilação JIT, desativa inlining. Todas as outras otimizações permanecerão em vigor. |
COR_PRF_DISABLE_OPTIMIZATIONS |
Não tem efeito sobre a pesquisa de imagem nativa. Na compilação JIT, desativa todas as otimizações, incluindo inlining. |
COR_PRF_MONITOR_ENTERLEAVE |
Faz com que a pesquisa de imagem nativa procurar imagens profiler aprimorado (ngen /profile). Na compilação JIT, inserções insira/deixar ganchos no código gerado. |
COR_PRF_MONITOR_CODE_TRANSITIONS |
Faz com que a pesquisa de imagem nativa procurar imagens profiler aprimorado (ngen /profile). Na compilação JIT, insere ganchos em pontos de transição gerenciados/não gerenciados. |
Geradores de perfis e imagens nativas
Quando o NGen. exe cria uma imagem nativa, ele faz grande parte do trabalho que o CLR geralmente executa em tempo de execução (por exemplo, classe carregamento e a função compilation). Como resultado, em casos onde o trabalho foi feito no tempo NGen, os seguintes retornos de chamada do gerador de perfil não serão recebidos em tempo de execução:
Imagens nativas do Profiler aprimorado
A criação de uma imagem nativa com NGen. exe ativa um conjunto de sinalizadores de geração de código que facilitam a imagem do perfil, como segue:
Inserir/deixar ganchos são inseridos no código.
Gerenciado/transição ganchos são inseridos no código.
ICorProfilerCallback::JITCachedFunctionSearchStarted e ICorProfilerCallback::JITCachedFunctionSearchFinished as notificações são emitidas como cada função de imagem nativa é invocada pela primeira vez.
ICorProfilerCallback::ClassLoadStarted e ICorProfilerCallback::ClassLoadFinished as notificações são emitidas como cada classe de imagem nativa é usado pela primeira vez.
Considerações sobre desempenho
O método usado para criar o perfil de seu aplicativo gerado por NGen depende de duas considerações: os dados que você precise adquirir e o efeito de criação de perfil incorporado prende em seu aplicativo.
Conforme discutido anteriormente neste tópico, existem dois cenários de criação de perfil NGen básicos:
Imagens nativas regulares (gerado por NGen imagens sem ganchos de criação de perfil): Essas imagens não causa qualquer sobrecarga da criação de perfil. No entanto, os retornos de chamada de carregar/descarregar classe não estão disponíveis para imagens nativas de regulares. Para lidar com essa situação, um gerador de perfil que deseja solicitar imagens nativas do profiler aprimorado terá que coletar dados sobre FunctionIDs ou ClassIDs como as identificações são encontrados. Por exemplo, um gerador de perfil de amostragem não encontrará um FunctionID quando FunctionID primeiro é compilado em JIT ou carregado a partir de uma imagem gerado por NGen, porque os retornos de chamada de carregamento/descarregamento de classe não são emitidos para regular gerado por NGen imagens. O profiler encontrará o FunctionID mais tarde, quando um exemplo que mostra o processo estava sendo executado em um ponteiro de instrução (IP) dentro do corpo do código compilado. da função Nesse caso, o profiler poderia consultar para obter informações sobre a função durante a amostragem ou pode fazer logon a FunctionID ou seu token de metadados associados para consultar ainda mais tarde. Portanto, o profiler consultará para obter informações sobre o FunctionID ou ClassID apenas no último momento possível (quando ele detecta que realmente é usada a identificação) em vez de versões anteriores, quando a identificação do primeiro produzida.
Profiler aprimorado imagens nativas (gerado por NGen imagens com ganchos de criação de perfil incorporados): Essas imagens são maiores e diferem significativamente de imagens regulares. Além disso, o comportamento do aplicativo pode ser diferente quando ele inclui os ganchos do profiler. Portanto, você deve usar o profiler aprimorado imagens nativas somente se o desempenho potencial e conseqüências de comportamentos (sobrecarga) são aceitáveis.