Quando si profila un programma Haskell scritto in GHC, i nomi delle funzioni typeclass vengono manomessi nel file .prof per distinguere le implementazioni di un'istanza da un altro. Come posso demangolare questi nomi per scoprire quale istanza del tipo è?Demangling typeclass functions in GHC profiler output
Per esempio, supponiamo di avere il seguente programma, dove i tipi Fast
e Slow
entrambi attuare 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)
posso compilare con -prof -auto-all -caf-all
e correre con +RTS -p
. Nel file .prof che viene generato, vedo che i centri di costo superiori sono:
COST CENTRE MODULE %time %alloc
show_an9 Main 71.0 83.3
sum' Main 29.0 16.7
E nella struttura, allo stesso modo io veda (omettendo righe irrilevanti):
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
Come faccio a capire che è l'implementazione Slow
di show
e non Fast
?