me encontré con este artículo aquí:La cuantificación del rendimiento de la recolección de elementos vs. Gestión de memoria explícita
La cuantificación del rendimiento de la recolección de elementos vs. Gestión de memoria explícita
http://www.cs.umass.edu/~emery/pubs/gcvsmalloc.pdf
En el sección de conclusión, dice:
Al comparar el tiempo de ejecución, el consumo de espacio, y las huellas de la memoria virtual en un rango de puntos de referencia , se muestra que el rendimiento tiempo de ejecución del mejor rendimiento del colector de basura es competitivo con la memoria explícita gestión cuando se le da suficiente memoria. En particular, cuando la recolección de basura tiene cinco veces más memoria que requerido, sus tiempo de ejecución de rendimiento fósforos o ligeramente superior al de gestión de memoria explícita. Sin embargo, el rendimiento de la recolección de basura se degrada sustancialmente cuando debe usar montones más pequeños. Con tres veces más de memoria, funciona un 17% más lento en promedio, y con el doble de memoria , funciona un 70% más lento. La recolección de basura también es más susceptible a paginación cuando la memoria física es escasa. En tales condiciones, todos los colectores de basura que examinamos aquí sufren rendimiento de orden de magnitud penalizaciones relativas a la gestión explícita de la memoria .
Por lo tanto, si mi interpretación es correcta: si tengo una aplicación escrita en C++ nativo requiere 100 MB de memoria, para lograr el mismo rendimiento con un lenguaje "administrado" (es decir, recolector de basura con base) (por ejemplo, Java, C#), la aplicación debería requerir 5 * 100 MB = 500 MB? (¿Y con 2 * 100 MB = 200 MB, la aplicación administrada funcionaría un 70% más lenta que la aplicación nativa?)
¿Sabes si los recolectores de basura actuales (es decir, los últimos VM de Java y .NET 4.0) sufren los mismos problemas descritos en el artículo antes mencionado? ¿Ha mejorado el rendimiento de los recolectores de basura modernos?
Gracias.
El recolector de basura utiliza un algoritmo de "mejor estimación" para determinar cuándo deshacerse de la memoria. Los algoritmos que utiliza no están necesariamente sintonizados con lo que sucede dentro de su programa específico. Cuando maneja la memoria usted mismo, debe ser más selectivo e inteligente sobre cómo se recopila la memoria, pero eso requiere más habilidad y esfuerzo, y corre el riesgo de pérdidas de memoria si no se realiza correctamente. –
@Robert Harvey: De hecho, creo que en C++, gracias a los destructores, RAII y punteros inteligentes, es difícil filtrar algo (ya sean recursos de memoria o recursos de otro tipo). De hecho, mientras que en Java se puede perder la liberación de un recurso en un intento ... finalmente bloquear, en C++ los destructores de las variables asignadas en la pila (o de los punteros inteligentes) se llaman automáticamente. (Por supuesto, esto supone que las clases están diseñadas correctamente, y cada clase libera sus propios recursos en su destructor). – EmbeddedProg
Así mi declaración, "... si no se hace correctamente". –