2008-12-03 14 views

Respuesta

34

de los patrones de Microsoft & Prácticas Improving .NET Application Performance and Scalability Capítulo 5:

Prefiero individual grande varios ensamblados bastante que pequeñas asambleas

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

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

  • El costo de metadatos de carga para conjuntos más pequeños.
  • Tocar varias páginas de memoria en imágenes precompiladas en el CLR en orden para cargar el conjunto (si está precompilado con Ngen.exe).
  • JIT tiempo de compilación.
  • Controles de seguridad.

Debido a que se paga sólo las páginas de memoria accede a su programa, más grandes asambleas proporcionan la utilidad Generador de imágenes nativas (Ngen.exe) con una mayor oportunidad de optimizar la imagen nativa 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 totales para hacer el trabajo en comparación con el mismo código establecido en múltiples ensamblajes .

A veces no puede evitar la división de conjuntos; por ejemplo, para versiones y razones de implementación. Si necesita enviar tipos por separado, puede necesitar ensamblajes por separado.

0

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

Si utiliza la reflexión y utiliza un bucle como para todos conjuntos, para todos los tipos en esos conjuntos, compruebe si tienen atributos, etc.. Esto podría JIT constructores estáticos y llamarlos en algunos casos.

Ah, vi la respuesta de Jon, se me 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.

10

Bueno, cada vez que un ensamblado se carga habrá alguna éxito debido a la pena de resolución - encontrar el archivo correcto, lo que podría verificar el número de versión, etc. Esto es probable que sea principalmente en el arranque.

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

1

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.

4

nunca he encontrado un éxito significativo para el rendimiento que localicé a cualquier tamaño o número 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 programa 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?

+0

preguntando en general, estaba leyendo material de marketing para ofuscadores y dicen que recortan el conjunto que es bueno para el rendimiento. – Blankman

+0

En ese caso, diría que probablemente estabas leyendo algo escrito por el equipo de marketing de ofuscadores, no de un equipo técnico con números para respaldar sus afirmaciones. :) –

6

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.

-2

variables locales no utilizados y las tareas innecesarias aumentar el tamaño de una asamblea y degradar el rendimiento .

Cuestiones relacionadas