Demangling typeclass Funktionen in GHC Profiler Ausgang
-
25-09-2019 - |
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?
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)