Desmangue as funções de típulo de típicas na saída do Profiler GHC
-
25-09-2019 - |
Pergunta
Ao criar um perfil de um programa Haskell escrito no GHC, os nomes das funções do TypeClass são mutilados no arquivo .prof para distinguir as implementações de uma instância delas de outra. Como posso desmembrar esses nomes para descobrir qual é a instância do tipo?
Por exemplo, suponha que eu tenha o seguinte programa, onde tipos Fast
e Slow
Ambos implementam 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)
Eu compilar com -prof -auto-all -caf-all
e correr com +RTS -p
. No arquivo .prof que é gerado, vejo que os principais centros de custo são:
COST CENTRE MODULE %time %alloc
show_an9 Main 71.0 83.3
sum' Main 29.0 16.7
E na árvore, eu também vejo (omitindo linhas 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
Como faço para descobrir isso show_an9
é Slow
implementação de show
e não Fast
'S?
Solução
Não, você não pode. o _an9
e _anx
As peças são geradas aleatoriamente. (Quando eu compilarei de novo eu tenho _ane
e _anC
.)
Você poderia usar o SCC
(Set-Center Center) Pragma para inserir um centro de custo 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]
O perfil deve mostrar:
main
show_an9
show(Slow)
sum'
show_anx
show(Fast)