2009-10-05 11 views
7

Durante los últimos días obtuve información acerca de los asignadores de memoria que no sean el estándar malloc(). Hay algunas implementaciones que parecen ser mucho mejores que malloc() para aplicaciones con muchos subprocesos. Por ejemplo, parece que tcmalloc y ptmalloc tienen un mejor rendimiento.¿Cuál es la mejor solución para reemplazar un nuevo asignador de memoria en un código existente?

Tengo una aplicación C++ que utiliza los operadores malloc y new en muchos lugares. Pensé que sustituirlos por algo como ptmalloc podría mejorar su rendimiento. Pero me pregunto cómo actúa el operador new cuando se usa en la aplicación C++ que se ejecuta en Linux. ¿Utiliza el comportamiento estándar de malloc o algo más?

¿Cuál es la mejor manera de reemplazar el asignador de memoria new con el antiguo en el código? ¿Hay alguna forma de anular el comportamiento o new y malloc o necesito reemplazar todas las llamadas una por una?

+0

¿Ha determinado que su programa dedica una cantidad significativa de tiempo a la gestión de la memoria? – rpg

+0

Sí, seguro que sí. Ya me he asegurado de que –

Respuesta

2

Desde el TCMalloc documentation:

Para utilizar TCmalloc, ponga el enlace tcmalloc en su aplicación a través de la bandera enlazador "-ltcmalloc". Puede utilizar tcmalloc en aplicaciones que no compilar tu mismo, mediante el uso de LD_PRELOAD:

$ LD_PRELOAD = "/ usr/lib/libtcmalloc.so"

ptmalloc parece ser similar (pero si está en Linux, es probable que ya lo esté utilizando because it's part of the GNU C library).

yo esperaría operator new llamar malloc, pero se puede comprobar fácilmente por sí mismo mediante el establecimiento de un punto de interrupción en malloc, a continuación, llamar a new. Si su new no llama al malloc, you can redefine it so that it does.

+1

Se saltó la parte donde dicen: LD_PRELOAD es complicado, y no recomendamos necesariamente este modo de uso. – rpg

+0

Así es, lo hice, porque no quería citar más que lo esencial. La documentación detallada está detrás del enlace. –

0

Creo que la anulación es definitivamente posible. Puede vincular su aplicación con la nueva biblioteca de implementación que desee y todas las llamadas a new, malloc serán reemplazadas. No he hecho eso. Pero supongo que es posible porque, al usar valgrind, usa sus propios asignadores de memoria para rastrear las estadísticas de uso de memoria de una aplicación y produce resultados al final. Entonces, si puede, definitivamente debería haber una manera.

Compruebe esto link. ¡Contiene información sobre la biblioteca de smartheap que es de un tipo similar!

1

Si su programa es multiproceso, entonces el asignador Hoard es muy apreciado. Personalmente, no creo que valga la pena molestar a Linux, ya que glibc's ptmalloc ya es bastante bueno.

+0

El código del que estoy hablando usa demasiadas llamadas nuevas y malloc. ptmalloc en realidad se invoca cuando el código se compila para Linux? –

+1

Sí, si está trabajando en Linux, ya está usando ptmalloc. –

0

¿Cuánto tiempo gasta su aplicación en asignación de memoria?

Cuestiones relacionadas