Pergunta

Eu quero fazer alguma avaliação comparativa de um processo de C #, mas eu não quero tempo de uso como meu vector - Eu quero contar o número de instruções IL que são executadas em uma chamada de método particular. Isso é possível?

Editar Eu não análise estática média de um corpo de método - Estou me referindo ao número real de instruções que são executadas - por isso, se, por exemplo, o corpo do método inclui um loop, a contagem seria aumentado em porém muitas instruções compõem o circuito * o número de vezes que o loop é iterado.

Foi útil?

Solução

Eu não acho que é possível fazer o que quiser. Isso ocorre porque o IL é usado apenas durante JIT (Just-In-Time) compilação. No momento em que o método está em execução a IL foi traduzido em código de máquina nativo. Assim, embora possa ser possível contar o número de instruções IL em um método dado / tipo / montagem estaticamente, não há conceito deste em tempo de execução.

Você não declararam a sua intenção em saber o número de instruções IL que seriam interpretados. Dado que só há uma correlação frouxa entre a contagem de IL de um corpo de método e o número real de instruções de código de máquina, não consigo ver o que saber esse número iria conseguir (que não satisfazer a sua curiosidade).

Outras dicas

Bem, não vai ser fácil. I pensar você poderia instrumento a sua montagem pós-compilação com o código do contador de desempenho que executado após blocos de IL. Por exemplo, se você tinha uma seção de um método que carregado um int para a pilha então executado um método estático usando esse int sob o código otimizado, você pode gravar uma contagem de 2 para a carga int e chamada.

Mesmo usando existentes IL / geridos montagem de leitura / escrita projectos, esta seria uma tarefa bastante assustadora para retirar.

Claro, algumas instruções que seu contador gravadas podem ficar otimizado afastado durante just-in-time compilar para x86 / ia64 / x64, mas isso é um risco que você tem que tomar para tentar ao perfil baseado em um Lanaguage abstrato como IL.

Você pode usar ICorDebug que tem uma interface gerenciada. Chuck um break point no início do método e passo programmaticly através do código até que ele deixa o método.

No entanto, não estou certo de quão útil a métrica será, as pessoas tendem a usar o tempo para este tipo de coisa. Algumas instruções IL são mais caros do que outros.

Eu uso o Código Metrics adicionar para Refletor

Os CodeMetrics add-in análises e calcula as métricas de qualidade de vários códigos em suas montagens. Este add-in usa Refletor para calcular métricas clássicas tais como a complexidade cyclomatic ou mais os simples, como o número de variáveis ??locais em um método. Todos os resultados podem ser salvos em um arquivo.

Instale o plugin. Seleccionar uma montagem e método de carga métricas. Ela vai mostrar uma grade com CodeSize, complexidade ciclomática, # da Instrução, etc.

Eu sei que você não quer que a contagem de estática. No entanto, a estática contar IL por arco, mais o número de vezes que o arco foi executado em conjunto dar-lhe a contagem IL. Você precisaria instrumento cada arco para isso, o que exige a inserção de um balcão.

(Um arco é uma sequência de instruções que você não pode saltar dentro ou para fora. Se você executar a primeira instrução, você sempre executar a última, etc.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top