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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top