Demangling fonctions de classe de types de sortie GHC profileur
-
25-09-2019 - |
Question
Lorsque le profil d'un programme Haskell écrit en GHC, les noms des fonctions sont mutilées dans classe de types le fichier .prof pour distinguer les implémentations d'un exemple d'entre eux d'une autre. Comment puis-je demangle ces noms pour savoir quelle instance de type, il est?
Par exemple, supposons que j'ai le programme suivant, où les types Fast
et Slow
appliquent tous deux des 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)
Je compilez avec -prof -auto-all -caf-all
et courir avec +RTS -p
. Dans le fichier .prof qui obtient généré, je vois que les centres de coûts supérieurs sont:
COST CENTRE MODULE %time %alloc
show_an9 Main 71.0 83.3
sum' Main 29.0 16.7
Et dans l'arbre, je vois même (en omettant les lignes non pertinentes):
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
Comment puis-je savoir que show_an9
est la mise en œuvre de Slow
de show
et non des années Fast
?
La solution
Non, vous ne pouvez pas. Les parties de _an9
et _anx
sont générés au hasard. (Quand je recompiler je suis arrivé _ane
et _anC
.)
Vous pouvez utiliser le SCC
(set-coût-centre) pragma pour insérer un centre de coûts manuellement:
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]
Le profil doit montrer:
main
show_an9
show(Slow)
sum'
show_anx
show(Fast)