como - malloc sizeof c++
Asignadores de memoria multiproceso para C/C++ (8)
Actualmente tengo una aplicación de servidor con varios subprocesos y busco un buen asignador de memoria de múltiples subprocesos.
Hasta ahora estoy dividido entre:
- El umem de Sun
- Tcmalloc de Google
- Asignador de bloques de construcción de roscado de Intel
- El tesoro de Emery Berger
Por lo que he descubierto, el tesoro podría ser el más rápido, pero no había oído hablar de él hasta hoy, por lo que soy escéptico si es realmente tan bueno como parece. ¿Alguien tiene experiencia personal probando estos asignativos?
El asignador locklessinc es muy bueno y el desarrollador responde si tienes preguntas. Hay un artículo que escribió sobre algunos de los trucos de optimización utilizados, es una lectura interesante: http://locklessinc.com/articles/allocator_tricks/ . Lo he usado en el pasado con excelentes resultados.
He usado tcmalloc y he leído sobre Hoard. Ambas tienen implementaciones similares y ambas logran una escala de rendimiento aproximadamente lineal con respecto al número de subprocesos / CPU (de acuerdo con los gráficos en sus sitios respectivos).
Entonces, si el rendimiento es realmente tan increíblemente crucial, entonces realice pruebas de rendimiento / carga. De lo contrario, solo tira un dado y elige uno de los listados (ponderado por la facilidad de uso en tu plataforma objetivo).
Y desde el enlace de trshiv , parece que Hoard, tcmalloc y ptmalloc son más o menos comparables para la velocidad. En general, parece que ptmalloc está optimizado para ocupar el menor espacio posible, Hoard está optimizado para un intercambio de velocidad + uso de memoria, y tcmalloc está optimizado para velocidad pura.
La única forma 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 cierta experiencia en el uso de Hoard donde trabajo (lo suficiente como 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 durante 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 por ello (y el precio es razonable, según 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 lo que quiera usar en absoluto; Si usted está constantemente malloc y liberando objetos que son todos del mismo tamaño, puede escribir un simple repartidor 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 ha decidido que los nuevos usuarios no pueden ser demasiado útiles, todo en una sola respuesta. Google puede ayudar bastante bien).
Personalmente prefiero y recomiendo ptmalloc como un asignador multiproceso. Hoard es bueno, pero en la evaluación que hizo mi equipo entre Hoard y ptmalloc hace unos años, ptmalloc era mejor. Por lo que sé, ptmalloc ha existido durante varios años y se usa ampliamente como asignador multiproceso.
Puede encontrar esta comparación útil.
Probablemente una respuesta tardía a su pregunta, pero
¿Por qué hacer mallocs si tienes un poco de rendimiento?
Una mejor forma sería hacer un malloc de una gran ventana de memoria en la inicialización y luego llegar a un light weight Memory manager
que lease out the memory chunks at run time
.
Esto evita cualquier posibilidad de llamadas al sistema si su expansión de almacenamiento dinámico.
Puede probar ltalloc (asignador de memoria global de propósito general con velocidad del asignador rápido de agrupaciones).
Tal vez esta es la forma incorrecta de abordar lo que está preguntando, pero tal vez podría emplearse una táctica diferente por completo. Si estás buscando un asignador de memoria realmente rápido, tal vez deberías preguntarte por qué tienes que gastar todo ese tiempo asignando memoria cuando quizás podrías simplemente salirte con la asignación de variables de la pila. La asignación de la pila, aunque es mucho más molesto, se puede hacer de manera correcta y puede ahorrarle mucho dinero en la contención del mutex, así como también evitar problemas extraños de corrupción de memoria fuera de su código. Además, posiblemente tenga menos fragmentación que podría ayudar.
Usamos el tesoro en un proyecto en el que trabajé hace unos años. Parecía funcionar bien. No tengo experiencia con los otros asignadores. Debería ser bastante fácil probar diferentes y realizar pruebas de carga, ¿no?