Sí, gc se amortiza en tiempo constante. Supongamos que tiene un algoritmo que se ejecuta por tiempo con un conjunto de trabajo pico de tamaño k . Ahora, tenga en cuenta que puede asignar como máximo O ( n ) palabras durante la ejecución del programa, y que el costo de tiempo de ejecutar un recolector de basura de copia es O ( k ) (es decir, el costo de un gc es proporcional al total cantidad de datos en vivo). Entonces, si ejecuta el gc la mayoría de las veces O ( n / k ) , entonces el costo total del tiempo de ejecución está limitado por O ( n )nortekO ( n )O ( k )O ( n / k )O(n), lo que significa que el costo amortizado del gc es constante. Entonces, si tiene un colector de estilo Cheney, con cada semiespacio de tamaño , entonces es fácil ver que no se puede invocar una colección completa más de una vez cada n / k pasos, ya que asignar k palabras toma O ( k ) tiempo, y el conjunto de trabajo nunca excede el tamaño k , lo que le da el límite que desea. Esto justifica ignorar los problemas de gc.2kn/kkO(k)k
Sin embargo, un caso en el que la presencia o ausencia de gc no es ignorable es cuando se escriben estructuras de datos sin bloqueo. Muchas estructuras de datos modernas sin bloqueo pierden deliberadamente memoria y dependen de gc para su corrección. Esto se debe a que a un nivel alto, la forma en que funcionan es copiar algunos datos, hacer un cambio en ellos e intentar actualizarlos atómicamente con una instrucción CAS, y ejecutar esto en un bucle hasta que el CAS tenga éxito. Agregar la desasignación determinista a estos algoritmos los hace mucho más complejos, por lo que las personas a menudo no se molestan (especialmente porque a menudo están dirigidos a entornos similares a Java).
EDITAR: si desea límites no amortizados, el cobrador de Cheney no lo hará: escanea todo el conjunto en vivo cada vez que se invoca. La palabra clave para google es "recolección de basura en tiempo real" y Djikstra et al. y Steele dio los primeros recolectores de marca y barrido en tiempo real, y Baker dio el primer gc de compactación en tiempo real.
@article {dijkstra1978fly,
title = {{Recolección de basura sobre la marcha: un ejercicio de cooperación}},
autor = {Dijkstra, EW y Lamport, L. y Martin, AJ y Scholten, CS y Steffens, EFM},
journal = {Comunicaciones de la ACM},
volumen = {21},
número = {11},
páginas = {966--975},
issn = {0001-0782},
año = {1978},
editor = {ACM}
}
@article {steele1975multiprocesamiento,
title = {{Multiprocesamiento compactando la recolección de basura}},
autor = {Steele Jr, GL},
journal = {Comunicaciones de la ACM},
volumen = {18},
número = {9},
páginas = {495--508},
issn = {0001-0782},
año = {1975},
editor = {ACM}
}
@article {baker1978list,
title = {{Procesamiento de listas en tiempo real en una computadora en serie}},
autor = {Baker Jr, HG},
journal = {Comunicaciones de la ACM},
volumen = {21},
número = {4},
páginas = {280--294},
issn = {0001-0782},
año = {1978},
editor = {ACM}
}
List.map
en OCaml es en realidad una complejidad cuadrática porque la profundidad de la pila es lineal y la pila se atraviesa cada vez que se evacua el vivero. Lo mismo ocurre con los sectores principales que encuentran grandes conjuntos de punteros.La referencia definitiva de recolección de basura es:
Ben Zorn hizo un trabajo midiendo los costos reales de diferentes algoritmos de recolección de basura, aunque el siguiente artículo es más reciente y presenta una comparación mucho más completa:
Para más ver:
fuente