Compartir a través de


Generación de código en la API de generación de perfiles

En este tema se explica el flujo de código del lenguaje intermedio de Microsoft (MSIL) a código nativo y cómo un generador de perfiles puede controlar la generación de código.

Generación automática de código frente a generación manual

El MSIL de un ensamblado de .NET Framework puede compilarse a código nativo de dos maneras:

  • Compilación manual: puede utilizarse la herramienta Generador de imágenes nativas (NGen.exe) para crear una imagen nativa.

  • Compilación automática: Common Language Runtime (CLR) puede realizar la compilación Just-In-Time (JIT) en tiempo de ejecución.

Tanto NGen.exe como el compilador JIT proporcionan marcadores que controlan la generación de código.

Cuando se carga un ensamblado, CLR busca primero una imagen nativa para el ensamblado. Si no encuentra una imagen nativa con el conjunto correcto de marcadores de generación de código, CLR manda las funciones a la compilación JIT en el ensamblado a medida que se necesitan durante la ejecución. Aunque se encuentre y se cargue una imagen nativa, CLR puede enviar a la compilación JIT algunas de las funciones del ensamblado.

Control del generador de perfiles sobre la generación de código

El generador de perfiles utiliza los marcadores de la tabla siguiente para controlar la generación de código.

Marcador

Efecto

COR_PRF_USE_PROFILE_IMAGES

(Necesita la versión 2.0 de .NET Framework.) Hace que la búsqueda de imágenes nativas busque imágenes mejoradas por el generador de perfiles (ngen /profile). Si la búsqueda no encuentra una imagen nativa mejorada por generador de perfiles para un ensamblado determinado, CLR mandaría en su lugar los métodos a la compilación JIT en ese ensamblado a medida que se necesiten.

No tiene ningún efecto sobre el código compilado JIT.

COR_PRF_DISABLE_INLINING

No tiene ningún efecto sobre la búsqueda de imágenes nativas.

En compilación JIT, deshabilita la ejecución en línea. Todas las demás optimizaciones permanecen en vigor.

COR_PRF_DISABLE_OPTIMIZATIONS

No tiene ningún efecto sobre la búsqueda de imágenes nativas.

En la compilación JIT, deshabilita todas las optimizaciones, incluida la ejecución en línea.

COR_PRF_MONITOR_ENTERLEAVE

Hace que la búsqueda de imágenes nativas busque imágenes mejoradas por el generador de perfiles (ngen /profile).

En la compilación JIT, inserta enlaces de entrada/salida en el código generado.

COR_PRF_MONITOR_CODE_TRANSITIONS

Hace que la búsqueda de imágenes nativas busque imágenes mejoradas por el generador de perfiles (ngen /profile).

En la compilación JIT, inserta enlaces en puntos de transición administrados/no administrados.

Generadores de perfiles e imágenes nativas

Cuando NGen.exe crea una imagen nativa, hace gran parte del trabajo que CLR realiza generalmente en tiempo de ejecución (por ejemplo, la carga de clases y la compilación de funciones). Como resultado, en los casos donde el trabajo se hizo en tiempo de NGen, no se recibirán las siguientes devoluciones de llamada del generador de perfiles en tiempo de ejecución:

Imágenes nativas mejoradas por el generador de perfiles

Al crear una imagen nativa con NGen.exe, se activa un conjunto de marcadores de generación de código que facilitan la generación de perfiles para la imagen, de la manera siguiente:

Consideraciones sobre el rendimiento

El método utilizado para generar el perfil de la aplicación generada por NGen depende de dos consideraciones: los datos que necesite adquirir y el efecto de los enlaces de generación de perfiles incrustados en la aplicación.

Como ya se explicó antes en este tema, hay dos escenarios básicos de generación de perfiles de NGen:

  • Imágenes nativas normales (imágenes generadas por NGen sin enlaces de generación de perfiles): estas imágenes no provocan ninguna sobrecarga de generación de perfiles. Sin embargo, las devoluciones de llamada de carga/descarga de clase no están disponibles para las imágenes nativas normales. Para administrar esta situación, un generador de perfiles que no desee solicitar imágenes nativas mejoradas por generador de perfiles tendrá que recopilar datos sobre FunctionID o ClassID cuando se encuentren los Id. Por ejemplo, un generador de perfiles de muestreo no encontrará ningún FunctionID cuando FunctionID se someta por primera vez a la compilación JIT o la carga desde una imagen generada por NGen, porque no se emiten devoluciones de llamada de carga/descarga de la clase para imágenes normales generadas por NGen. El generador de perfiles encontrará más tarde el FunctionID, cuando un ejemplo muestra que el proceso se estaba ejecutando en un puntero de instrucción (IP) dentro del cuerpo del código compilado de la función. En este caso, el generador de perfiles podría consultar información sobre la función durante el muestreo, o registrar el FunctionID o su símbolo (token) de metadatos asociado para realizar la consulta incluso más tarde. Por consiguiente, el generador de perfiles solamente consultará información sobre FunctionID o ClassID en el último momento posible (cuando detecte que se utiliza realmente el Id.) en lugar de hacerlo antes, cuando se genera el Id. por primera vez.

  • Imágenes nativas mejoradas por generador de perfiles (imágenes generadas por NGen con enlaces incrustados de generación de perfiles): estas imágenes son mayores y difieren significativamente de las imágenes normales. Además, el comportamiento de la aplicación puede ser diferente cuando incluye enlaces del generador de perfiles. Por consiguiente, solamente debe utilizar imágenes nativas mejoradas por generador de perfiles si el rendimiento potencial y las consecuencias sobre el comportamiento (sobrecarga) son aceptables.

Vea también

Conceptos

Información general sobre la generación de perfiles