Como la gente ha señalado: GC es más rápido de asignar (porque acaba de aparecer el siguiente bloque en su lista), pero más lento en general (porque tiene que compactar el montón regularmente, para que los allocs sean rápidos).
así - ir para la solución de compromiso (que en realidad es muy muy bueno):
Usted crea sus propios montones, uno para cada tamaño de objeto que generalmente asignar (o 4 bytes, de 8 bytes, 16- byte, 32 bytes, etc.) entonces, cuando quiere una nueva pieza de memoria, toma el último 'bloque' en el montón apropiado. Debido a que se asigna previamente desde estos montones, todo lo que necesita hacer cuando se asigna es tomar el siguiente bloque libre. Esto funciona mejor que el asignador estándar porque está desperdiciando memoria: si desea asignar 12 bytes, abandonará un bloque completo de 16 bytes del montón de 16 bytes. Mantiene un mapa de bits de bloques v libres utilizados para que pueda asignarlos rápidamente sin desperdiciar mucha memoria ni necesidad de compactar.
Además, debido a que está ejecutando varios montones, los sistemas altamente paralelos funcionan mucho mejor ya que no es necesario bloquearlos con tanta frecuencia (es decir, tiene varios bloqueos para cada pila, por lo que no obtiene casi tanta)
Pruébelo: lo usamos para reemplazar el montón estándar en una aplicación muy intensa, el rendimiento aumentó bastante.
BTW. La razón por la que los asignadores estándar son lentos es que intentan no desperdiciar memoria, por lo que si asigna 5 bytes, 7 bytes y 32 bytes del montón estándar, mantendrá esos 'límites'. La próxima vez que necesite asignar, se desplazará a través de aquellos que buscan suficiente espacio para darle lo que usted solicitó. Eso funcionó bien para los sistemas de memoria baja, pero solo tienes que mirar cuánta memoria usan la mayoría de las aplicaciones hoy para ver que los sistemas GC vayan por el otro lado, y traten de hacer asignaciones lo más rápido posible sin preocuparte por la cantidad de memoria vano.
¿Estás diciendo que todo esto dependerá de qué * idioma *, C o C++, uno usa? Dado que en cualquiera de estos lenguajes, uno tiene que implementar GC uno mismo, creo que no hay variación por idioma, solo por variación de algoritmo. –
No estoy del todo seguro de lo que estás preguntando. Pero, los mismos algoritmos de administración de memoria se pueden aplicar a ambos idiomas. Sin embargo, en C++ haría algo como anular el operador nuevo y eliminar para implementarlo. En C no estoy seguro; posiblemente nombre sus propias funciones y asegúrese de usarlas para todas las asignaciones. –