Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés

Usar los métodos para volver a compilar JIT para agregar la instrumentación

A partir de .NET Framework 4,5, los generadores de perfiles pueden instrumentar los métodos que han sido ya en (JIT) el momento compilados mediante los métodos de ICorProfilerInfo4 volver a compilar el programa.

Un generador de perfiles puede solicitar al compilador JIT para volver a compilar una función en cualquier momento. Al volver a compilar una función, el generador de perfiles especifica los marcadores de la generación de código y los cuerpos comunes de lenguaje (CIL) intermedio como sigue:

  1. El generador de perfiles indica su intención de utilizar los métodos de la recompilación JIT en inicio. Haga esto especificando el indicador de COR_PRF_ENABLE_REJIT cuando llama al método de ICorProfilerInfo:: SetEventMask . El generador de perfiles también especifica la marca de COR_PRF_DISABLE_ALL_NGEN_IMAGES para evitar los módulos de NGEN de carga.

  2. Cuando los módulos han terminado de cargarse, el generador de perfiles realiza todas las ediciones y ampliaciones de metadatos necesarias para admitir cualquier instrumentación que haga más adelante con métodos de ese módulo. Que elija, el generador de perfiles llama al método de ICorProfilerInfo4:: RequestReJIT de un subproceso creado en cualquier momento después previamente, y pasa el método una lista de funciones para volver a compilar.

  3. Common Language (CLR) Runtime identifica estas funciones para la recompilación la próxima vez que se llaman. Si hay varias instancias de una función (cada instancia representada por FunctionID), todas las instancias se identifican para la recompilación. La próxima vez que se llama a las instancias de la función, el CLR realiza una recompilación de JIT.

  4. Si la instancia de una función es la primera instancia que volver a compilar, problemas de CLR una devolución de llamada del método de ICorProfilerCallback4:: GetReJITParameters para obtener instrucciones del generador de perfiles. La devolución de GetReJITParameters proporciona ICorProfilerFunctionControl (Interfaz). Las llamadas del generador de perfiles admiten en esta interfaz para establecer los parámetros de la generación de código y el nuevo cuerpo de CIL para utilizar al volver a compilar la función. Estos parámetros se aplican a todas las instancias de la función.

  5. Problemas de CLR a una devolución de ICorProfilerCallback4:: ReJITCompilationStarted .

  6. Cuando se completa la recompilación, problemas de CLR una devolución de ICorProfilerCallback4:: ReJITCompilationFinished . La llamada de función que provocó la recompilación se dirige al nuevo código (volver a compilar). Cualquier llamada a esta instancia también van al nuevo código.

  7. En cualquier momento después de esto, el generador de perfiles, ejecutándose en un subproceso creado, puede previamente llamar al método de ICorProfilerInfo4:: RequestRevert para reinstalar la versión originalmente compilación JIT (sin modificaciones del generador de perfiles) de las funciones especificadas.

Cada instancia de función tiene solo una versión actual, que corresponde a uno de los siguientes:

  • Si una recompilación no ha producido para la función, es la versión original.

  • Si la última operación JIT para la función es una recompilación, es la versión vuelve a compilar más reciente.

  • Si la última operación JIT para la función revirtió la recompilación, es la versión original.

Las nuevas invocaciones de una instancia de la función provocan siempre la versión actual de la función.

Un generador que utiliza métodos de compilar JIT no puede realizar las siguientes operaciones:

  • Modifique los metadatos para un módulo (distinto de agregar nuevo LocalVarSigTokens) después de que la devolución de ICorProfilerCallback:: ModuleLoadFinished de módulo ha vuelto.

  • Vuelva a compilar cuerpos de método creados por el generador de imágenes nativas (NGen.exe).

  • Vuelva a compilar los métodos al utilizar adjunto/desasociar la generación de perfiles.

  • Recompile insertadas funciones.

  • Permite cualquier ensamblado nativo de Imágenes Nativas a la carga. (COR_PRF_DISABLE_ALL_NGEN_IMAGES se debe incluir en los indicadores pasados al método de ICorProfilerInfo:: SetEventMask en inicio).

  • Vuelva a compilar los métodos dinámicos y ensamblados dinámicos.

Nota Nota

CLR reclama la memoria utilizada por la recompilación JIT cuando se descarga AppDomain que contiene. CLR no recupera esta memoria anterior, incluso si se ha dejado el método volver a generar.

  1. Generador de perfiles de instrumentación: Un generador que permite al usuario a la visión de perfil y que necesita en una aplicación agregando código concreto de instrumentación en la aplicación, recopilando datos resultando fuera de instrumentación, y analizando o resumir los datos.

  2. Common Intermediate Language (CIL) : El lenguaje de programación legible inferior definido por la especificación de Common Language Infrastructure y utilizado por .NET Framework.

  3. JIT recompilation : La recompilación de código nativo de CIL mediante el compilador JIT.

  4. ReJITID : Un identificador opaco (definido como typedef UINT_PTR ReJITID;) para un determinado devueltos a compilar la versión de una función. El par de (FunctionID, ReJITID) es necesario identificar una instancia vuelve a compilar de la función. ReJITIDs para diferentes FunctionIDs no relacionados entre sí, aunque FunctionIDs está asociado. Por ejemplo, si se vuelve a compilar Function<T>() , ReJITIDs resultante para Function<Int>() y Function<String>() no son necesariamente iguales. ReJITID =0 hace referencia a la versión original de la función.

  5. función: Utilizado en el sentido de metadatos de word. Por ejemplo, Function<T>() se identifica mediante (Module, MethodDef).

  6. Instancia de función: Una instancia de una función para un tipo determinado en tiempo de ejecución. Las funciones genéricas pueden tener varias instancias; por ejemplo, Function<T>() puede ser Function<Int>() y Function<String>(). Incluso las funciones no genéricas pueden tener una instancia en cada uno de los dominios de aplicación. Una instancia de la función se identifica de forma única mediante FunctionID.

  7. versión de la función: Un detalle devuelto a compilar la versión de una función (por ejemplo, la versión original de Function<Int>() o la segunda versión vuelve a compilar de Function<String>()), identifica de forma exclusiva mediante (FunctionID, ReJITID).

Mostrar: