Defanning TypeClass функционирует в Profiler Prefiler GHC
-
25-09-2019 - |
Вопрос
При профилировании программы Haskell, написанную в GHC, имена функций TypeClass поднимаются в файле .prof, чтобы различить реализации их экземпляра от другого. Как я могу сбить эти имена, чтобы узнать, какой экземпляр типа это?
Например, предположим, что у меня есть следующая программа, где типы 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-Centre) Pragma, чтобы вставить Центр затрат вручную:
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)