Desenredo funciones clase de tipos de la producción de perfiles GHC
-
25-09-2019 - |
Pregunta
Al perfilar un programa escrito en Haskell GHC, los nombres de las funciones de clase de tipos se truncan en el archivo .prof distinguir las implementaciones de una instancia de ellos de otro. ¿Cómo puedo demangle estos nombres para saber qué tipo de instancia que es?
Por ejemplo, supongamos que tengo el siguiente programa, donde los tipos Fast
y Slow
tanto implementar Show
:
import Data.List (foldl')
sum' = foldl' (+) 0
data Fast = Fast
instance Show Fast where
show _ = show $ sum' [1 .. 10]
data Slow = Slow
instance Show Slow where
show _ = show $ sum' [1 .. 100000000]
main = putStrLn (show Fast ++ show Slow)
Me compilar con -prof -auto-all -caf-all
y correr con +RTS -p
. En el archivo .prof que se genera, veo que los centros de costo superior son:
COST CENTRE MODULE %time %alloc
show_an9 Main 71.0 83.3
sum' Main 29.0 16.7
Y en el árbol, también yo ver (omitiendo líneas irrelevantes):
individual inherited
COST CENTRE MODULE no. entries %time %alloc %time %alloc
main Main 232 1 0.0 0.0 100.0 100.0
show_an9 Main 235 1 71.0 83.3 100.0 100.0
sum' Main 236 0 29.0 16.7 29.0 16.7
show_anx Main 233 1 0.0 0.0 0.0 0.0
¿Cómo darse cuenta de que es show_an9
aplicación de Slow
de show
y no de Fast
?
Solución
No, no puede. Las partes _an9
y _anx
son generados aleatoriamente. (Cuando puedo compilar de nuevo y llegué _ane
_anC
.)
Se podría utilizar el SCC
(conjunto de costo-centro) pragma para insertar un centro de costos manualmente:
data Fast = Fast
instance Show Fast where
show _ = {-# SCC "show(Fast)" #-} show $ sum' [1 .. 10]
data Slow = Slow
instance Show Slow where
show _ = {-# SCC "show(Slow)" #-} show $ sum' [1 .. 100000000]
El perfil debe mostrar:
main
show_an9
show(Slow)
sum'
show_anx
show(Fast)