Plantilla de perfil Haskell
ghc template-haskell (2)
Tengo un archivo TH-heavy que tarda unos 30 segundos en compilarse. ¿Cuáles son algunas de las técnicas que puedo usar para ayudar a depurar el rendimiento de mi plantilla Haskell?
A partir de GHC 8, esto se puede hacer con -fexternal-interpreter .
Compile la biblioteca que define la función TH con el perfil habilitado, luego compile el código * que usa la función TH en un empalme con las opciones de GHC -fexternal-interpreter -opti+RTS -opti-p
. Esto debería producir un archivo llamado ghc-iserv-prof.prof
.
Este enfoque tiene la ventaja de que puede utilizar la funcionalidad completa de la mónada Q
* También funciona una suite de referencia en el mismo proyecto cabal que la biblioteca TH (pero en un hs-source-dir diferente). Incluso podría funcionar con una función TH definida y utilizada en la misma biblioteca, pero creo que en ese momento estará perfilando el código interpretado.
Si entiendo correctamente el flujo de compilación de TH, las funciones haskell normales se ejecutan mientras se empalma en el momento de la compilación. Pero puedes correr luego en el tiempo de ejecución por tu cuenta, por supuesto.
Por ejemplo, tienes algo como $ (foo xy ...) en tu archivo TH-heavy. Cree otro archivo y llame ''foo xy'' allí, pero no empalme el resultado. Entonces podrás perfilar ''foo'' como siempre. Si el cuello de botella está en la etapa de generación AST, lo localizará. No te olvides de considerar la pereza.