La única manera de saber realmente qué asignador de memoria es el adecuado para su aplicación es probar algunas. Todos los asignadores mencionados fueron escritos por gente inteligente y vencerán a los demás en una marca de microbenchmark particular u otra. Si toda su aplicación hace todo el día es malloc un pedazo de 8 bytes en el hilo A y lo libera en el hilo B, y no necesita manejar nada más, probablemente podría escribir un asignador de memoria que supere los pantalones de cualquiera de los enumerados hasta el momento. Simplemente no será muy útil para mucho más. :)
Tengo experiencia en el uso de Hoard donde trabajo (suficiente para que uno de los errores más oscuros abordados en la versión reciente 3.8 se haya encontrado como resultado de esa experiencia).Es un muy buen asignador, pero lo bueno para usted depende de su carga de trabajo. Y tiene que pagar por Hoard (aunque no es demasiado caro) para usarlo en un proyecto comercial sin tener que GPL su código.
Un ptmalloc2 muy poco adaptado ha sido el asignador detrás del malloc de glibc desde hace bastante tiempo, por lo que es increíblemente utilizado y probado. Si la estabilidad es importante sobre todas las cosas, podría ser una buena opción, pero no lo mencionaste en tu lista, así que supongo que está fuera. Para ciertas cargas de trabajo, es terrible, pero lo mismo puede decirse de cualquier malloc de uso general.
Si está dispuesto a pagar (y el precio es razonable, en mi experiencia), SmartHeap SMP también es una buena opción. La mayoría de los otros asignadores mencionados están diseñados como reemplazos malloc/nuevos/eliminados gratuitos que pueden ser LD_PRELOAD'd. SmartHeap también se puede usar de esa manera, pero también incluye una API completa relacionada con la asignación que le permite ajustar sus asignadores al contenido de su corazón. En las pruebas que hemos realizado (una vez más, muy específicas para una aplicación en particular), SmartHeap era casi lo mismo que Hoard para el rendimiento cuando actuaba como un reemplazo de malloc incorporado; la diferencia real entre los dos es el grado de personalización. Puede obtener un mejor rendimiento con el propósito menos general que necesita su asignador.
Y dependiendo de su caso de uso, un asignador multiproceso de propósito general podría no ser el que quiera usar en absoluto; Si está constantemente malloc & liberando objetos que son todos del mismo tamaño, es posible que desee simplemente escribir un asignador simple de losas. La asignación de Slab se usa en varios lugares del kernel de Linux que se ajustan a esa descripción. (Te daría un par de enlaces más útiles, pero soy un "nuevo usuario" y Stack Overflow ha decidido que los nuevos usuarios no pueden ser demasiado todo en una sola respuesta. Google puede ayudar bastante bien, aunque .)
Qué problema específico (s) está tratando de resolver con el administrador del montón predeterminado actual que está utilizando? Y, ¿cuál es ese? –
En su aplicación, intente comprobar si puede mejorar el rendimiento mediante el uso de almacenamiento local de subprocesos. Si existe la posibilidad de hacerlo, las ganancias pueden ser mejores que usar un asignador multiproceso. – trshiv