¿El tamaño de ensamblado .NET afecta el rendimiento?

¿El tamaño de un conjunto .net afecta el rendimiento? ¿Qué hay de la cantidad de ensambles en su formulario de Windows / formularios web?

De los patrones y prácticas de Microsoft Mejorando el rendimiento y escalabilidad de la aplicación .NET Capítulo 5:

Prefiere ensamblajes grandes individuales en lugar de ensamblajes pequeños y múltiples

Para ayudar a reducir el conjunto de trabajo de su aplicación, debe preferir conjuntos individuales más grandes en lugar de conjuntos múltiples más pequeños. Si tiene varios ensambles que siempre se cargan juntos, debe combinarlos y crear un ensamblaje único.

La sobrecarga asociada con tener múltiples conjuntos más pequeños se puede atribuir a lo siguiente:

  • El costo de cargar metadatos para ensamblajes más pequeños.
  • Tocar varias páginas de memoria en imágenes pre comstackdas en el CLR para cargar el ensamblaje (si está precomstackdo con Ngen.exe).
  • JIT tiempo de comstackción.
  • Revisiones de seguridad.

Debido a que solo paga por las páginas de memoria a las que accede su progtwig, las ensamblajes más grandes proporcionan la utilidad Native Image Generator (Ngen.exe) con una mayor posibilidad de optimizar la imagen original que produce. Una mejor disposición de la imagen significa que los datos necesarios se pueden presentar de forma más densa, lo que a su vez significa que se necesitan menos páginas para realizar el trabajo en comparación con el mismo código establecido en varios ensamblajes.

A veces no puedes evitar dividir ensamblajes; por ejemplo, para las razones de despliegue y despliegue. Si necesita enviar tipos por separado, es posible que necesite conjuntos por separado.

Bueno, cada vez que se carga un ensamblaje, habrá un golpe debido a la penalización de resolución, encontrando el archivo correcto, posiblemente verificando el número de versión, etc. Es probable que esto se deba principalmente a la puesta en marcha.

Sin embargo, no creo que afecte significativamente el rendimiento del “estado estable”.

Un DLL de estructura compacta siempre se cargará en un espacio de memoria mínimo de 64 kb, sin importar cuán pequeño sea. Por lo tanto, cargar cuatro archivos DLL de CF separados de 10 kb le costará 256 kb en el dispositivo. Si los combina ( ILMerge ) solo le costaría 64 kb de memoria en el dispositivo.

Nunca me he encontrado con un golpe significativo al rendimiento que rastreé hasta el tamaño o la cantidad de conjuntos. La gran mayoría de los problemas de rendimiento significativos que he rastreado han sido el resultado de debilidades algorítmicas.

Como dice Jon Skeet, es probable que haya un pequeño golpe debido a la resolución en el arranque. lassevk también tiene un punto sobre la resolución dinámica de ensamblajes a través de la reflexión. Sin embargo, ninguno de estos debería afectar el rendimiento más de una vez en el transcurso del progtwig y, en el curso normal de las cosas, probablemente no sea un rendimiento significativo a menos que trabaje bajo algunas limitaciones de desempeño terriblemente estrictas.

Quizás algún contexto adicional en cuanto al problema sería útil. ¿Hace esta pregunta porque tiene un software con muchos ensamblajes grandes y está tratando de acelerarlo, por ejemplo?

Dudo mucho que afecte el rendimiento en cualquier grado mensurable. Habrá alguna penalización por cargarlo al inicio; y el uso de la memoria probablemente se incrementará en un MB o dos, pero aparte de eso, no. Bueno, a menos que hagas código que sufra debido a esto tú mismo.

Dicho esto, no he visto ninguna prueba, por lo que podría estar equivocado.

Una cosa que sé afectará el rendimiento, en relación con el tamaño del ensamblaje, al menos si el tamaño del ensamblaje está relacionado con el número de clases, métodos, etc.

Si utiliza el reflection y utiliza un bucle como para todos los ensamblajes, para todos los tipos en esos ensamblajes, verifique si tienen atributos, etc. Esto podría JIT constructores estáticos y llamarlos en algunos casos.

Ah, vi la respuesta de Jon, olvidé mencionar. JIT’ing de código solo ocurrirá una vez por pieza de código, por supuesto, así que si todo lo que haces es reflejar sobre los tipos, y nunca tocarlos después, el tamaño del conjunto afectará la duración de ese ciclo de reflexión, pero después de eso no debería importar en absoluto.

Estoy de acuerdo con la respuesta de Dan y solo para agregar un poco más de información: aquí hay otra publicación de blog relevante para apoyar ese punto de vista: http://blogs.msdn.com/junfeng/archive/2004/02/23/78139.aspx

No, no afecta

Las variables locales no utilizadas y las asignaciones innecesarias aumentan el tamaño de un ensamblaje y degradan el rendimiento.