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?

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top