today tendencias populares hashtags haskell garbage-collection real-time

haskell - tendencias - trending hashtags instagram today



Estado actual de Haskell soft en tiempo real (4)

¿Has visto esto?

Además, recomendaría contactar a los autores de la Colección de Basura Multicore con papel de Montículos Locales (ISMM 2011).

Estoy considerando Haskell para una aplicación suave en tiempo real. Probablemente usaré actores, por lo que vale. Me pregunto si alguien tiene una idea del estado actual de Haskell en tiempo real. Específicamente, problemas con el GC al detener la aplicación. Busqué extensamente en Google, y encontré una gran cantidad de discusiones desde hace más de dos años, pero nada actual. Estas son algunas de las referencias que he encontrado:

Usando Haskell para sistemas considerables en tiempo real: ¿cómo (si?)?

¿Qué hay del rendimiento del GC de Haskell para una aplicación en tiempo real suave como los juegos?

Muchas de las cosas más antiguas que he leído sugieren que la situación (en ese momento) estaba mejorando. ¿Lo tiene?

Incluso hace más de 2 años, hubo algunos comentarios que sugerían que las aplicaciones de Haskell podrían ajustarse para mantener de manera confiable las pausas de GC en un milisegundo o dos. ¿Esto parece realista?


Entonces, la preocupación por el "tiempo real" es la latencia introducida por las colecciones de GC.

GHC usa un recolector de basuras multinúcleo (y hay una rama con montones locales por subprocesos ). Desarrollado originalmente para mejorar el rendimiento de multícore (cada núcleo puede recopilarse de forma independiente ) al reducir el costo de la sincronización frecuente stop-the-world, esto también beneficia a soft-real time por la misma razón. Sin embargo, a partir de 2013, el montón local por subproceso aún no se ha fusionado en el GHC principal, aunque el GC paralelo ha sido.

Para un juego, deberías poder explotar esto mediante el uso de subprocesos y, de este modo, reducir la necesidad de colecciones locales stop-the-world.

Para los objetos de larga vida, en el montón global, aún se arriesga un poco (ms) GC. Sin embargo, un perfil cuidadoso con, por ejemplo, ThreadScope eliminará los obstáculos aquí. He visto videos 1080p en tiempo real transmitidos a través de una pila de red gestionada por GHC sin pausas de GC notables.

E incluso sin estos ajustes, las cosas "podrían funcionar". Frag casi no necesitó ninguna optimización, y ahora era soft en tiempo real hace casi 10 años.

Finalmente, hay muchas herramientas y banderas GHC para mejorar el rendimiento:

  • ghc-gc-tune : obtenga un desglose gráfico de las banderas óptimas de GC
  • Asesoramiento sobre el rendimiento
  • Opciones para recolección de basura - (-Los segundos pueden ser útiles)

Y luego está la codificación: use tipos no compartidos (sin GC), minimice la asignación de estructura diferida. Mantenga datos de larga duración en forma empaquetada. Prueba y punto de referencia

Creo que estarás bien.


GHC 8.2.1 tiene una característica llamada Compact Regions que podría ser útil.

Desde mi punto de vista, parece ser un tipo de gestión de memoria semi-manual. Puede almacenar datos de larga duración en una Región compacta y el recolector de elementos no utilizados no lo rastrea. Si hay alguna referencia a algo en la Región de Compact, toda la Región de Compact se mantiene activa. Una vez que no haya referencias a nada en la región, será desasignado. Si realiza actualizaciones funcionales de los contenidos de una región, puede volver a asignarla en una nueva región y la región anterior se liberará.

http://ezyang.com/compact.html
https://hackage.haskell.org/package/compact-0.1.0.1/docs/Data-Compact.html


No he encontrado problemas con las pausas de GC, siempre y cuando no uses listas perezosas para todo, no deberías generar demasiada basura.

Sin embargo, Sky no es tan brillante para aplicaciones de subprocesos múltiples. GHC aún no tiene un programador con prioridades de subprocesos; si usa subprocesos para el procesamiento de fondo pesado, puede matar de hambre fácilmente su bucle de eventos.