При профилировании программы Haskell, записанной в GHC, названия функций typeclass искажаются в .prof файле для различения реализаций одного экземпляра их от другого. Как может я demangle эти имена для обнаружения, какой экземпляр типа это?
Например, предположите, что у меня есть следующая программа, где типы Fast
и Slow
обе реализации 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)
Я компилирую с -prof -auto-all -caf-all
и выполненный с +RTS -p
. В .prof файле, который сгенерирован, я вижу, что лучшие центры затрат:
COST CENTRE MODULE %time %alloc
show_an9 Main 71.0 83.3
sum' Main 29.0 16.7
И в дереве, я аналогично вижу (исключение несоответствующих строк):
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
Как я выясняю это show_an9
Slow
реализация show
и нет Fast
?
Нет, не можете. Части _an9
и _anx
генерируются случайным образом. (При повторной компиляции я получил _ane
и _anC
.)
Вы можете использовать прагму SCC
(set-cost-center) для вставки стоимости центрировать вручную:
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]
В профиле должно отображаться:
main
show_an9
show(Slow)
sum'
show_anx
show(Fast)