2010-05-11 20 views
8

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?

risposta

8

No, non è possibile. Le parti _an9 e _anx vengono generate in modo casuale. (Quando compilo di nuovo mi sono _ane e _anC.)

È possibile utilizzare il (set-costo-centro) Pragma SCC 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 dovrebbe mostrare:

main 
    show_an9 
    show(Slow) 
    sum' 
    show_anx 
    show(Fast)