Montón de Linux: ¿está haciendo un montón de nuevas / eliminaciones bien o el montón se fragmenta mucho?

No estoy familiarizado con cómo se asigna el montón de Linux.

Estoy llamando a malloc () / free () muchas veces por segundo, siempre con los mismos tamaños (hay alrededor de 10 estructuras, cada tamaño fijo). Aparte del tiempo de inicio, nada de mi memoria permanece asignada durante largos períodos de tiempo.

¿Se considera esto una forma deficiente con los montones estándar? (Estoy seguro de que alguien preguntará '¿qué montón estás usando?' - 'Ugh. El montón estático estándar' ... lo que significa que no estoy seguro).

¿Debería usar en su lugar una lista libre o el montón tolera muchas de las mismas asignaciones? Intento equilibrar la legibilidad con el rendimiento.

¿Alguna herramienta que me ayude a medir?

preguntado el 27 de agosto de 11 a las 16:08

Si comparte su código, es posible que le demos consejos de optimización. -

Hacer que todas las asignaciones requieran el mismo tamaño suena como una oportunidad para un esquema de asignación de "grupo", que podría ser potencialmente más rápido, porque es más simple que un asignador de propósito general. -

@Kerrek: Por otro lado, asignar y liberar muchos objetos de tamaño idéntico debería ser bastante rápido con el asignador glibc. R. tiene razón, no hay razón para preocuparse por esto hasta que su generador de perfiles se lo indique. La única vez que he visto ayuda de "grupos" es en una aplicación de subprocesos múltiples; el asignador de glibc no está tan caliente cuando muchos subprocesos compiten por el montón. -

ptmalloc debería funcionar bastante bien con varios subprocesos que compiten por el montón, siempre que la asignación y la libertad tengan lugar en el mismo subproceso. Este es en realidad el objetivo de ptmalloc. Sin embargo, creo que todo el concepto de ajustar el rendimiento del asignador con heurísticas como esta está un poco equivocado, ya que el rendimiento del asignador no debería marcar una diferencia medible en una aplicación bien diseñada. -

@R: En mi experiencia, ptmalloc no funciona muy bien incluso cuando todos los hilos liberan sus propias asignaciones. Los números de rendimiento de tcmalloc también respaldan esto ... Y para algunas aplicaciones, la asignación de muchos objetos pequeños es la forma más natural de codificar. (Especialmente asignando muchos objetos pequeños y luego liberándolos todos a la vez. Llámalo un "vector" o un "asignador de grupo"; equivale a lo mismo).

3 Respuestas

En primer lugar, a menos que tengas mesurado un problema con el uso de la memoria que explota, ni siquiera piense en usar un asignador personalizado. Es una de las peores formas de optimización prematura.

Al mismo tiempo, incluso si tiene un problema, una mejor solución que un asignador personalizado sería averiguar por qué está asignando y liberando objetos tanto y solucionar el problema de diseño que lo está causando.

Para abordar su pregunta específica, el asignador de glibc se basa en el algoritmo dlmalloc, que es casi óptimo cuando se trata de fragmentación. La única forma de lograr que fragmente la memoria de forma incorrecta es la forma inevitable: asignando objetos con tiempos de vida radicalmente diferentes en alternancia, por ejemplo, asignando una gran cantidad de objetos pero solo liberando todos los demás. Creo que le resultará difícil elaborar un patrón de asignación que dará un uso de memoria total peor que los grupos ...

Respondido 27 ago 11, 21:08

Voté esto en contra porque es condescendiente y parece que 'R' no leyó mi publicación completa antes de subirse al caballo alto. el último párrafo es útil hasta el punto en el que se vuelve condescendiente de nuevo y no obtiene sus datos --- ¿cómo se votan tan altas respuestas como esta, que hacen que el stackoverflow esté lleno de cruft? Desearía que 'R' no supusiera que estaba en un mal camino, sino que asumió que estoy en un camino sólido y respondió (o ignoró) las preguntas que se están respondiendo. - atascado

Valgrind tiene una herramienta especial macizo para medir el uso de la memoria. Esto debería ayudar a perfilar las asignaciones de montón.

Respondido 27 ago 11, 22:08

Creo que la mejor optimización del rendimiento es evitar la asignación de montones siempre que sea posible (y razonable). Siempre que se asigna una pila a un objeto, el compilador simplemente moverá el puntero de la pila hacia arriba en lugar de intentar encontrar un lugar libre o devolver la memoria asignada a alguna lista libre.

¿Cómo se define la vida útil de sus estructuras? Si puede expresar la vida útil de su objeto mediante el alcance, esto de hecho aumentaría el rendimiento.

Respondido 28 ago 11, 21:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.