Pregunta

Continuando con la discusión de entendimiento VS2010 C # paralelo perfilado resultados pero más a el punto:

Tengo muchos hilos que trabajan en paralelo (utilizando Parallel.For / cada una), que utilizan muchas asignaciones de memoria para las pequeñas clases.

Esto crea una contención en el hilo mundial asignador de memoria.

¿Hay una manera de instruir .NET para asignar previamente un banco de memoria para cada hilo y hacer todas las asignaciones de esta reserva?

En la actualidad mi solución es mi propia implementación de grupos de memoria (arrays asignados a nivel mundial de objeto de tipo T, que se reciclan entre los hilos), que ayuda mucho, pero no es eficiente porque:

  1. No puedo instruir .NET de asignar una porción de memoria específica.
  2. Todavía necesita llamar a new muchas veces para asignar la memoria para las piscinas.

Gracias,
Hageo

¿Fue útil?

Solución

he buscado durante dos días tratando de encontrar una respuesta a la misma cuestión que tenías. La respuesta es que necesita para establecer el modo de recolección de basura a modo de servidor. Por defecto, la recolección de basura modo de ajuste a modo de estación de trabajo. Configuración de la recolección de basura a modo de servidor hace que el montón administrado a dividir en secciones administradas por separado, una por la CPU. Para ello, es necesario agregar un ajuste de configuración para su archivo app.config.

<runtime>
   <gcServer enabled="true"/>
</runtime>

La diferencia de velocidad en mi 12 núcleos Opteron 6172 fue dramático!

Otros consejos

El recolector de basura no asignar memoria.

Suena más como que está asignando un montón de pequeños objetos temporales y algunos objetos vivido largo, y el recolector de basura está gastando un montón de tiempo de la basura recogida de los objetos temporales por lo que su aplicación no tiene que pedir más la memoria del sistema operativo. De Framework 4 Desarrollo Avanzado - Garbage Collection :

Mientras el espacio de direcciones está disponible en el montón administrado, el tiempo de ejecución sigue para asignar espacio para los nuevos objetos. Sin embargo, la memoria no es infinito. Eventualmente, el recolector de basura debe realizar una colección con el fin de liberar memoria.

La solución:. No asigne un montón de pequeños objetos temporales La página de recolección de basura y rendimiento podría también ser útil.

Se podría asignar previamente un montón de objetos, y mantenerlos en grupos destinados a hilos separados. Sin embargo, lo más probable es que no hay nada mejor rendimiento de este.

El recolector de basura está especialmente diseñado para manejar objetos pequeños de corta vida de manera eficiente. Si se mantiene los objetos en una piscina, que son de larga duración y sobrevivirán a una recolección de basura, lo que a medios giros que se copiarán a la segunda generación del montón. Esta copia será más caro que un simple asignación de nuevos objetos.

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