¿Existen reglas genéricas a seguir para descubrir la causa cuando un programa compilado por GHC gasta demasiado tiempo en la recolección de basura? ¿Y qué se consideraría generalmente demasiado? Por ejemplo, en general, ¿el 60% de productividad es aceptable o es una indicación de que algo probablemente esté mal con el código?Asesoramiento genérico sobre la reducción del tiempo de GC en GHC
19
A
Respuesta
10
He aquí una lista rápida y muy incompleta:
- de prueba y de referencia. Una de las pocas debilidades de Haskell es la dificultad para predecir los costos de tiempo y espacio. Si no tiene datos de prueba, no tiene nada.
- Usa mejores algoritmos. Esto suena demasiado simple, pero la optimización de algoritmos ineficientes es como rapear s ** t en oro.
- Estratégicamente hacer que algunos datos sean más estrictos. Prueba y punto de referencia! El objetivo es almacenar el valor de WHNF físicamente más pequeño en lugar del valor que lo produce, limpiando así más basura en el primer pase más eficiente. busca funciones complicadas que producen datos simples.
- Estratégicamente hacer que algunos datos sean menos estrictos. Prueba y punto de referencia! El objetivo es retrasar la producción de una gran cantidad de datos hasta justo antes de que se use y se descarte, con lo que se limpiará más basura en el primer pase más eficiente. Busque funciones simples que producen grandes datos complejos. Ver también comonads.
- Haga un uso estratégico de las matrices y los tipos sin caja, en particular, vea # 2. con respecto a la mónada ST. Prueba y punto de referencia! Todos estos encajan datos más crudos en una memoria más pequeña y compacta. Hay menos basura para recoger.
- Fiddle con la configuración RTS (específica de ghc). Prueba y punto de referencia! El objetivo es "igualar la impedancia" del GC con las necesidades de memoria de su programa. Me pierdo aún más aquí, luego en 1-5, así que pregúntales a los expertos sobre este.
La mejor recolección de basura tiene una premisa bastante simple: cree menos basura, recójala antes, produzca menos asignaciones de memoria/desasignación. Cualquier cosa que pueda hacer que pueda resultar en uno de estos tres efectos vale la pena. Prueba y punto de referencia!
+1
+1 para establecer una conexión entre la optimización del algoritmo y el tratamiento de la materia fecal.Poner lápiz labial en el cerdo ahora está envejeciendo, eh :) – Sal
Cuestiones relacionadas
- 1. Reducción del tiempo de carga del applet
- 2. Asesoramiento sobre qué idioma usar
- 3. Duración del tiempo GC excesivo en "java.lang.OutOfMemoryError: el límite superior del GC excedió"
- 4. Asesoramiento sobre la creación de un micro-framework en JavaScript
- 5. ¿Cuándo tiene RAII una ventaja sobre GC?
- 6. Asesoramiento sobre MoM y mensajes grandes
- 7. ¿Cuánto tiempo toma un GC?
- 8. Sobre el cierre, LexicalEnvironment y GC
- 9. Asesoramiento en la creación y verificación de scripts del enlazador
- 10. Asesoramiento sobre el uso de ASP.net WebForms o MVC
- 11. Asesoramiento sobre cómo mejorar una implementación de búsqueda difusa actual
- 12. Reducción del tamaño de JRE
- 13. Asesoramiento sobre el marco de prueba de .NET
- 14. Reducción en la perspectiva
- 15. Asesoramiento/discusión sobre estructuras de datos "autorreferenciales" anónimas
- 16. Reducción del tamaño de bitmap en C#
- 17. GC de Lua y juego en tiempo real
- 18. Asesoramiento en Python Parser Generators
- 19. Registros detallados del GC de Java
- 20. Serialize Tipo genérico sobre Servicio WCF
- 21. ¿Cómo debo interpretar el resultado del generador de perfiles ghc?
- 22. Necesita asesoramiento para implementar una prueba de tiempo limitado
- 23. java.lang.OutOfMemoryError: el límite superior del GC excedió
- 24. Asesoramiento en AOP con C#
- 25. ¿Qué significa la entrada críptica del caché del GC?
- 26. ¿El genérico es el tiempo de ejecución o el tiempo de compilación del polimorfismo?
- 27. ¿Algoritmo de reducción de cola?
- 28. GC Android - LogCat siempre muestra la actividad de GC
- 29. Reducción del tamaño del archivo PNG en .NET
- 30. Analizador de reducción en Javascript
Para reducir el GC, primero puede usar el perfil de GHC para rastrear qué código es el que más asigna. –
Asigne menos, y obtendrá menos GC. En general, creo que el 25% de GC es aceptable, más alto que eso y empiezo a buscar maneras de reducir la asignación. – augustss
A menudo, ejecutar el programa con "+ RTS -H" ayuda mucho. Además, compila con -O2. – aleator