Demangling funzioni typeclass in uscita profilatore GHC
-
25-09-2019 - |
Domanda
Quando profilazione un programma scritto in Haskell GHC, i nomi delle funzioni typeclass sono alterati nel file .prof di distinguere le implementazioni di loro uno dell'istanza da un altro. Come posso decodifica i questi nomi per scoprire quale tipo di esempio è?
Per esempio, supponiamo di avere il seguente programma, dove i tipi Fast
e Slow
sia implementare 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)
I compilare con -prof -auto-all -caf-all
e correre con +RTS -p
. Nel file .prof che viene generato, vedo che i centri di costo superiore sono:
COST CENTRE MODULE %time %alloc
show_an9 Main 71.0 83.3
sum' Main 29.0 16.7
E nella struttura, che allo stesso modo vedere (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 show_an9
è l'implementazione di Slow
show
e non di Fast
?
Soluzione
No non si può. Le parti _an9
e _anx
sono generati casualmente. (Quando compilo di nuovo mi sono _ane
e _anC
.)
È possibile utilizzare il SCC
(set-costo-centro) Pragma per inserire un centro di costo 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]
Il profilo deve mostrare:
main
show_an9
show(Slow)
sum'
show_anx
show(Fast)