Frage

Wenn Sie ein Haskell-Programms in GHC geschrieben Profilierung, die Namen von typeclass Funktionen sind in der Datei .prof verstümmelt von einem anderen Instanz Implementierungen von ihnen zu unterscheiden. Wie kann ich demangle diese Namen, um herauszufinden, welche Art der Instanz ist es?

Zum Beispiel, nehme ich das folgende Programm haben, wo Typen Fast und Slow beide implementieren 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)

ich mit -prof -auto-all -caf-all und läuft mit +RTS -p kompilieren. In der .prof-Datei, die generiert wird, sehe ich, dass die Top-Kostenstellen sind:

COST CENTRE                    MODULE               %time %alloc

show_an9                       Main                  71.0   83.3
sum'                           Main                  29.0   16.7

Und in dem Baum, sehe ich ebenfalls (Weglassen irrelevant Zeilen):

                                                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

Wie ich aus stelle, dass show_an9 ist Slow Implementierung von show und nicht Fast ist?

War es hilfreich?

Lösung

Nein kann man nicht. Die _an9 und _anx Teile werden zufällig generiert. (Wenn ich kompilieren wieder bekam ich _ane und _anC.)

Sie könnten die SCC verwenden (Set-Cost-Zentrum) Pragma eine Kostenstelle einfügen manuell:

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]

Das Profil sollte zeigen:

  main
   show_an9
    show(Slow)
     sum'
   show_anx
    show(Fast)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top