Pregunta

Recientemente estaba ejecutando el ejemplo proporcionado por Andrew Hunter en su blog "Los peligros del gran montón de objetos" Compilado contra .NET 4 y obtuve los siguientes números:

Con bloques grandes: 622 MB asignado
Con bloques grandes, colecciones de basura frecuentes: 582 MB asignadas
Solo bloques pequeños: 1803 MB asignado
Con bloques grandes, los bloques grandes no crecen: 630 MB asignados

Si el mismo código se compila contra.net 2.0, obtuve casi los números mencionados en el artículo:

Con bloques grandes: 21 MB asignado
Con bloques grandes, colecciones de basura frecuentes: 26 MB asignado
Solo bloques pequeños: 1811 MB asignado
Con bloques grandes, los bloques grandes no crecen: 707 MB asignados

¿Cuál es la causa de una mejora tan dramática?

El código se compila para la plataforma X86 y se ejecuta en Windows 7

¿Fue útil?

Solución

Algunos trabajos muy necesarios del equipo de CLR es la razón de las mejoras, pero aparentemente todavía hay margen de mejora:

http://mitch-heat.blogspot.com/2010/11/net-clr-large-object-teap.html

Otros consejos

Algo cambió pero es un secreto bien guardado, no puedo encontrar nada al respecto. No pondría demasiado stock en eso. La muestra de código se ajustó a mano a la creación del montón de objetos grandes CLR 2 se veía lo más malo posible. Incluso un pequeño cambio en el algoritmo, tal vez inspirado en la publicación del blog, tendrá efectos muy grandes.

Puedo pensar en algunas cosas fáciles que Microsoft podría haber hecho al asignador de memoria que habría reducido en gran medida la fragmentación de LOH sin una revisión importante, como los tamaños de asignación de redondeo hasta algunos múltiples como 4K. Dado que los objetos LOH no estáticos más pequeños eran 85K, eso representaría como máximo una pérdida del 5% de espacio útil, pero reduciría el número de objetos y brechas de diferentes tamaño. Por cierto, realmente no estoy convencido del valor que obliga a todos los objetos grandes a la LOH (en lugar de, tal vez, tener un medio de designación cuando se crea un objeto si debería ir al LOH o no). Puedo entender algún valor para separar objetos pequeños de los grandes una vez que alcanzan el nivel 2, pero hay suficientes casos en los que se crean y abandonan los objetos grandes que obligarlos a nivel 2 parece contraproducente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top