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 é Slowimplementação de show e não Fast'S?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top