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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top