visual valid generate example comment c# .net clr jit

generate - which example is a valid visual c# xml documentation comment



¿Dónde se almacena en caché el código.NET JIT compilado? (6)

Como han señalado otros, el código es JIT en función de cada proceso en su caso, y no se almacena en caché: la aceleración que está observando en la segunda carga es el almacenamiento en caché del disco del sistema operativo (es decir, en la memoria) de los conjuntos.

Sin embargo, aunque no hay almacenamiento en caché (aparte del almacenamiento en caché del disco del sistema operativo) en la versión desktop / server del marco, hay un almacenamiento en caché del código de máquina JIT en otra versión del marco.

Interesante es lo que está sucediendo en el .Net Compact Framework (NETCF para la repetición de Windows Phone 7). Los avances recientes permiten compartir algunos códigos marco de JIT entre procesos donde el código de JIT se almacena en caché. Esto se ha llevado a cabo principalmente para obtener un mejor rendimiento (tiempo de carga y uso de memoria) en dispositivos restringidos como los teléfonos móviles.

Entonces, en respuesta a la pregunta, no hay almacenamiento directo en el marco del código JIT''d en la versión de escritorio / servidor del CLR, pero sí en la última versión del marco compacto, es decir, NETCF.

Referencia: Creemos en compartir

http://blogs.msdn.com/b/abhinaba/archive/2010/04/28/we-believe-in-sharing.aspx

Un programa .NET se compila primero en el código MSIL. Cuando se ejecuta, el compilador JIT lo compilará en código de máquina nativo.

Me pregunto:

¿Dónde se almacena este código de máquina compilado por JIT? ¿Solo se almacena en el espacio de direcciones del proceso? Pero dado que la segunda puesta en marcha del programa es mucho más rápida que la primera vez, creo que este código nativo debe haberse almacenado en el disco incluso después de que la ejecución haya finalizado. ¿Pero donde?


Creo que el código compilado JIT nunca se almacena o se cambia de memoria. El aumento de rendimiento que percibe en una segunda ejecución de un ensamblaje se debe a que los ensamblajes dependientes ya se encuentran en la memoria o en la memoria caché del disco.


El código de máquina compilado de JIT se almacena en la memoria caché por cada método, cada vez que se ejecuta un método por primera vez. No creo que nunca se almacene en caché en el disco.

Puede encontrar que el proceso es más rápido para cargar la segunda vez porque Windows almacenó en caché (en la memoria) los archivos utilizados por su proceso (archivos DLL, recursos, etc.) en la primera ejecución. En la segunda ejecución no hay necesidad de ir al disco, ya que esto puede haberse hecho en la primera ejecución.

Puede confirmar esto ejecutando NGen.exe para precompilar realmente el código de máquina para su arquitectura y comparar el rendimiento de la primera y la segunda ejecución. Mi apuesta es que la segunda ejecución aún sería más rápida, debido al almacenamiento en caché en el sistema operativo.


En resumen, el IL se compila con JIT para cada invocación del programa y se mantiene en las páginas de códigos del espacio de direcciones del proceso. Vea el Capítulo 1 de Richter para una gran cobertura del modelo de ejecución .NET.


Memoria. Se puede almacenar en caché, ese es el trabajo de ngen.exe. Genera una versión .ni.dll del ensamblaje, que contiene el código de la máquina y se almacena en el GAC. Que luego se carga automáticamente, sin pasar por el paso JIT.

Pero eso tiene poco que ver con la razón por la que su programa comienza más rápido la segunda vez. La primera vez que tienes un llamado "arranque en frío". Lo cual está completamente dominado por el tiempo empleado en encontrar las DLL en el disco duro. La segunda vez que tiene un buen inicio, las DLL ya están disponibles en el caché del sistema de archivos.

Los discos son lentos. Un SSD es una solución obvia.

Fwiw: este no es un problema exclusivo del código administrado. Los grandes programas no administrados con muchas DLL también lo tienen. Dos ejemplos canónicos, presentes en la mayoría de las máquinas de desarrollo, son Microsoft Office y Acrobat Reader. Ellos hacen trampa. Cuando se instalan, ponen un "optimizador" en la clave de registro de ejecución o en la carpeta de inicio. Todo lo que hacen estos optimizadores es cargar todas las DLL que utiliza el programa principal y luego salir. Esto prepara el caché del sistema de archivos, cuando el usuario utiliza posteriormente el programa, se iniciará rápidamente ya que su inicio en caliente es rápido.

Personalmente, me parece extraordinariamente molesto. Porque lo que realmente hacen es ralentizar cualquier otro programa que quiera iniciar después de iniciar sesión. Lo que rara vez es Office o Acrobat. Me refiero a eliminar estos optimizadores, repetidamente si es necesario cuando una actualización arruinada lo devuelve.

Puedes usar este truco también, pero usalo responsablemente por favor.


Sí, NGEN.EXE colocará una versión compilada JIT de un ejecutable .NET en el GAC, incluso cuando la versión MSIL no esté allí. Lo he intentado, pero en vano. Creo que, a menos que la versión original de MSIL también esté en el GAC y se cargaría desde allí, no se usará la versión JIT en el GAC. También creo que las compilaciones JIT sobre la marcha ( no NGEN) nunca se almacenan en caché; ocupan solamente memoria de proceso.

Creo esto al leer el documento de MS y de varios experimentos. Me gustaría recibir una confirmación o una refutación de mis afirmaciones por parte de aquellos que "saben".