2012-09-13 18 views
19

En relación con mi otra pregunta Haskell collections with guaranteed worst-case bounds for every single operation?, tengo curiosidad: ¿Cuánto tiempo puede causar una recolección de basura?¿Cuánto tiempo pueden ocurrir pausas en un programa Haskell debido a la recolección de basura?

¿Haskell usa algún tipo de recolección incremental de basura para que un programa se detenga solo por períodos pequeños a la vez, o puede detenerse durante varios segundos en un caso extremo?

Encontré dos documentos de SPJ sobre el tema: https://research.microsoft.com/en-us/um/people/simonpj/papers/non-stop/index.htm. Pero no encontré una referencia si estas ideas fueron realmente adoptadas por GHC (u otras implementaciones de Haskell).

+4

Tenga en cuenta que, en teoría, existen muchas causas de retrasos imprevistos no acordados en el funcionamiento de un programa. Estos incluyen cosas como la búsqueda de memoria virtual y los cambios de contexto realizados por el sistema operativo. Estos se aplican a todos los idiomas, incluso a aquellos que no usan recolección automática de basura. En teoría, estos pueden insertar retrasos entre dos operaciones de cualquier programa, con * ninguna garantía * de una longitud máxima de retardo. En la práctica, rara vez son un problema con el que hay que lidiar en la programación "normal". Las demoras de GC son las mismas. – Ben

Respuesta

24

GHC está diseñado para rendimiento computacional, no latencia. Como resultado, GHC usa un recolector de basura generational, multi-threadedwith thread-local heaps. La recolección de basura de objetos locales de subprocesos no detiene otros subprocesos. El GC principal ocasional del montón global detendrá todos los hilos.

Por lo general, las pausas son en el pequeño número de milisegundos, sin embargo, no hay garantía de latencia.

Puede controlar la frecuencia de GC a través de several runtime flags (por ejemplo, el intervalo gc -I).

+3

Estoy bastante seguro de que las cosas de los montones locales no están en la línea principal. Simon Marlow dijo que hizo que el GC sea mucho más complicado sin mejorar tanto el rendimiento del GC. Entonces, la respuesta revisada es: todos los GC causan pausas (generalmente bastante cortas) y los GC principales se realizan en paralelo. Los tiempos de pausa reales dependen en gran medida del tamaño del montón. '+ RTS -s' en realidad imprime los tiempos de pausa, por lo que es fácil de descubrir. – nominolo

Cuestiones relacionadas