No encontré mucha documentación en el commentery. ¿Hay alguna buena publicación en el blog o similar sobre esto?¿Cómo se implementa el soporte de tiempo de ejecución de ghc para el perfil?
Respuesta
La mejor fuente de información sobre el marco de perfiles aún podría ser el original paper de Patrick Sansom y Simon Peyton Jones. Se pueden encontrar detalles adicionales en Sansom's PhD thesis y later paper agregando una especificación formal. Simon Marlow también habló sobre algunos cambios recientes en la Actualización de estado de GHC en Haskell Implementors' Workshop 2011.
La idea detrás de centro de costos de perfiles es para anotar el árbol de expresión con nodos "centro de coste", por lo que por ejemplo, con -auto-all
el programa tendrá anotaciones gustaría sigue:
fib n = {-# SCC foo #-} (case n of
0 -> 0
1 -> 1
n -> fib (n-1) + fib (n-2))
En tiempo de ejecución al entrar fib
, el programa miraría la "pila del centro de costo" actual y agregaría "foo" a la cima. Esto se revertiría una vez que la evaluación salga nuevamente del alcance de la anotación SCC. Un poco de magia asegura que si, digamos, n
resulta ser un valor diferido y el programa necesita ejecutar su código, el centro de costo apropiado para se restaura el código cuando es necesario.
Esta infraestructura se utiliza entonces para tanto tiempo, así como perfiles de espacio:
Un temporizador se compruebe la pila coste-centro periódicamente. Cada vez que se encuentra una cierta pila de centro de coste, esto cuenta como un "tic". Al final, el RTS calculará la cantidad de tiempo por acumulación de centro de costo a partir del recuento de sus marcas, lo que le brindará un perfil de tiempo.
Cada vez que se asigna un objeto, el programa guarda un puntero a la pila del centro de coste que estaba vigente en ese momento. Esto permite que el recolector de basura proporcione una estadística de cuántos bytes residían, desglosados por sitio de asignación.
como se solicita en el comentario, unas palabras sobre la optimización: Por razones obvias, el marco puede no permitir que las optimizaciones que se mueven los costos no constantes de un centro de coste a la otra, lo que obliga al optimizador a ser bastante pesimista veces. Por ejemplo, en el ejemplo anterior, la versión actual GHC será no podrá desempaquetar el valor de retorno, lo que significa que cada llamada recursiva realizará una asignación de montón innecesaria.
Como regla general, no debe contar con ninguna transformación de código que ocurra en una anotación SCC. En caso de duda, es mejor anotar una función suficientemente alta en la pila de llamadas, por lo que los bits críticos para el rendimiento no se anotan en absoluto.
Puede encontrar this paper por Jones, Marlow & Singh útil, dependiendo de lo que quiere lograr. Incluye prácticas para perfilar programas de GHC en un contexto paralelo y contiene algunos estudios de casos que pueden serle útiles.
- 1. Compilación de ghc con soporte de -fPIC
- 2. cómo configurar el temporizador para calcular el tiempo de ejecución
- 3. ¿Cuánto infla el perfil de Xdebug el tiempo real de ejecución?
- 4. ¿Cómo se implementa el marco de aislamiento de Moles?
- 5. ¿Cómo se implementa el resaltado de sintaxis?
- 6. ¿Qué es ARR_WORDS en un perfil de montón de GHC?
- 7. ¿Cómo se prueba el tiempo de ejecución del código VBA?
- 8. ¿Cómo usar struct timeval para obtener el tiempo de ejecución?
- 9. ¿Cuenta el tiempo de espera para el límite de tiempo de ejecución?
- 10. ¿Cómo se implementa el tiempo de espera de consultas JDBC de Oracle?
- 11. desactivar el tiempo de ejecución datagridviewcombobox
- 12. ¿Cómo se implementa el ThreadLocal de Java bajo el capó?
- 13. Repositorio de Maven para el tiempo de ejecución Eclipse BIRT
- 14. Decidir qué propiedades se serializan en el tiempo de ejecución
- 15. Creación con indicadores de tiempo de ejecución utilizando cabal y ghc
- 16. StringTemplate para el gen del código de tiempo de ejecución?
- 17. tiempo de ejecución determinar el tipo para C++
- 18. Soporte de Emacs para el lenguaje D
- 19. ¿Cómo activo el soporte de geolocalización en cromedriver para Selenium?
- 20. Cómo modificar el tiempo de ejecución de la sección web.config?
- 21. ¿Cómo modificar el código de JavaScript en tiempo de ejecución?
- 22. ¿Qué es el tiempo de ejecución moderno?
- 23. ¿Qué se necesita para agregar soporte de Objective-C al tiempo de ejecución de lenguaje común de .NET?
- 24. Prueba de tiempo de ejecución de MonoTouch para ver si se está ejecutando en el simulador
- 25. Mida el tiempo de ejecución en C#
- 26. maravilloso para el tiempo de ejecución del bucle
- 27. Establecer el tiempo máximo de ejecución para exec() específicamente
- 28. ¿Cómo se implementa el filtro de recorte de photoshop?
- 29. ¿Cómo cambias el tamaño de Fancybox en tiempo de ejecución?
- 30. de LLVM para GHC
Después de una búsqueda de Google relativamente infructuosa, me temo que GHC HQ está muy ocupado implementando y mejorando para escribir sobre ella. –
Creo que la mayoría sigue siendo más o menos como se describe en el [documento de Sansom & Jones] (http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.6277). ¿Hay algo específico que le interese? –
¡Gracias por la referencia! Esa debería ser una respuesta. Creo que rwh menciona que algunas optimizaciones son incompatibles con la creación de perfiles – user239558