Does.NET ¿el tamaño del ensamblaje afecta el rendimiento?


¿El tamaño de un ensamblado. net afecta en absoluto al rendimiento? ¿Qué tal el número de ensamblados en su proyecto de formularios de Windows/formularios web?

Author: Anthony Mastrean, 2008-12-03

9 answers

De los Patrones y Prácticas de Microsoft Mejorando el Rendimiento y la Escalabilidad de las Aplicaciones. NET Capítulo 5:

Prefiera Ensamblajes Grandes Individuales En Lugar De Múltiples Conjuntos más pequeños

Para ayudar a reducir el conjunto de trabajo de su aplicación, debe preferir solo más grande ensamblajes en lugar de múltiples ensamblajes más pequeños. Si tiene varias asambleas que siempre se cargan juntos, debe combinarlos y crear un solo Asamblea.

El 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 precompiladas en el CLR en orden para cargar el ensamblaje (si está precompilado con Ngen.exe).
  • Tiempo de compilación JIT.
  • Controles de seguridad.

Porque solo paga por las páginas de memoria a las que accede su programa, más grandes las asambleas proporcionan Native Image Generator utility (Ngen.exe) con una mayor posibilidad de optimizar la imagen nativa que produce. Un mejor diseño de la imagen significa que los datos necesarios se pueden presentar más densamente, lo que a su vez significa menos en general las páginas son necesarias para hacer el trabajo en comparación con el mismo código establecido en múltiples Asamblea.

A veces no se puede evitar dividir ensamblados; por ejemplo, para versionar y razones de despliegue. Si necesita enviar tipos por separado, es posible que necesite separado Asamblea.

 34
Author: Dan Blanchard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-17 08:15:04

Bueno, cada vez que se carga un ensamblado habrá algún golpe debido a la penalización de resolución: encontrar el archivo correcto, verificar potencialmente el número de versión, etc. Esto es probable que sea principalmente en la puesta en marcha.

Sin embargo, no creo que afecte significativamente el rendimiento en "estado estacionario".

 10
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-03 13:50:40

Una DLL de marco compacto siempre se cargará en un espacio de memoria mínimo de 64 kb, sin importar lo pequeño que sea. Por lo tanto, cargar cuatro DLL CF separados de 10 kb le costará 256 kb en el dispositivo. Si los combinara ( ILMerge ) solo le costaría 64 kb de memoria en el dispositivo.

 6
Author: Anthony Mastrean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-03 14:02:20

Nunca he encontrado un impacto significativo en el rendimiento que rastreé al tamaño o al número de ensamblajes. 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 algún pequeño golpe debido a la resolución en el inicio. lassevk también tiene un punto con respecto a la resolución dinámica de asambleas a través de la reflexión. Ninguno de los dos debería afectar el rendimiento más de una vez el curso del programa, sin embargo, y en el curso normal de las cosas que probablemente no es un éxito de rendimiento significativo a menos que esté trabajando bajo algunas restricciones perf terriblemente estrictas.

Tal vez algún contexto adicional en cuanto al problema sería útil. ¿Estás haciendo esta pregunta porque tienes una pieza de software con muchos ensamblajes grandes y estás tratando de acelerarlo, por ejemplo?

 4
Author: Greg D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-03 13:55:52

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

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

 1
Author: Vilx-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-03 13:53:48

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 usa reflexión y usa 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 llamar a estos en algunos casos.

Ah, vi la respuesta de Jon, olvidé mencionarlo. JIT'ing de código solo ocurrirá una vez por pieza de código, por supuesto, así que si todo lo que haces es reflexionar sobre los tipos, y nunca tocarlos palabras posteriores, el tamaño del ensamblaje afectará la duración de ese bucle de reflexión, pero después de eso no debería importar en absoluto.
 0
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-03 14:05:00

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

 0
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-10 06:37:33

No, no afecta

 -2
Author: Samiksha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-03 13:55:27

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

 -3
Author: ligaoren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-12 05:06:22