Pregunta

Quiero hacer una evaluación comparativa de un proceso de C #, pero no quiero usar el tiempo como mi vector. Quiero contar el número de instrucciones IL que se ejecutan en una llamada de método particular. ¿Es esto posible?

Editar No me refiero al análisis estático de un cuerpo del método; me refiero al número real de instrucciones que se ejecutan, por lo que si, por ejemplo, el cuerpo del método incluye un bucle, el recuento aumentaría, sin embargo, muchas instrucciones forman el bucle * el número de veces que se repite el bucle.

¿Fue útil?

Solución

No creo que sea posible hacer lo que quieres. Esto se debe a que el IL solo se utiliza durante la compilación JIT (Just-In-Time). Cuando el método se está ejecutando, el IL se ha traducido a código de máquina nativo. Entonces, si bien es posible contar el número de instrucciones de IL en un método / tipo / ensamblaje determinado de forma estática, no hay ningún concepto de esto en tiempo de ejecución.

No ha manifestado su intención de saber el número de instrucciones de IL que se interpretarían. Dado que solo existe una correlación suelta entre el recuento de IL del cuerpo del método y el número real de instrucciones de código de máquina, no veo qué se lograría saber este número (aparte de satisfacer su curiosidad).

Otros consejos

Bueno, no será fácil. Creo que podría equipar su ensamblaje después de compilarlo con un código de contador de rendimiento que se ejecuta después de los bloques de IL. Por ejemplo, si tenía una sección de un método que cargó un int en la pila y luego ejecutó un método estático usando ese int bajo el código optimizado, podría registrar un conteo de 2 para la carga de int y llamar.

Incluso utilizando proyectos existentes de lectura / escritura de ensamblajes administrados / IL, esta sería una tarea bastante difícil de lograr.

Por supuesto, algunas instrucciones que su contador grabó podrían optimizarse durante la compilación justo a tiempo en x86 / ia64 / x64, pero ese es un riesgo que tendría que tomar para tratar de hacer un perfil basado en un lenguaje abstracto. como IL.

Puede usar ICorDebug que tiene una interfaz gestionada. Despliegue un punto de ruptura al comienzo del método y realice un paso programático a través del código hasta que abandone el método.

Sin embargo, no estoy seguro de cuán útil será la métrica, las personas tienden a usar el tiempo para este tipo de cosas. Algunas instrucciones de IL son más caras que otras.

Utilizo Métricas de código agregar a Reflector

  

Los análisis complementarios de CodeMetrics y   calcula varias métricas de calidad de código   en sus asambleas. Este complemento utiliza   Reflector para calcular métricas clásicas.   tales como la complejidad ciclomática o más   Los sencillos como el   Número de variables locales en un método.   Todos los resultados se pueden guardar en un archivo.

Instala el plugin. Seleccione un conjunto y métricas de método de carga. Le mostrará una cuadrícula con CodeSize, CyclomaticComplexity, # of Instruction, etc.

Sé que no quieres el conteo estático. Sin embargo, el recuento de IL estático por arco, más el número de veces que el arco se ejecutó en forma conjunta le da el recuento de IL. Necesitaría instrumentar cada arco para esto, lo que requiere insertar un contador.

(Un arco es una secuencia de instrucciones que no puede saltar ni entrar. Si ejecuta la primera instrucción, siempre ejecutará la última, etc.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top