Demangling typeclass функционирует в произведенном профилировщике GHC

При профилировании программы 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?

8
задан Georg Fritzsche 11 May 2010 в 03:21
поделиться

1 ответ

Нет, не можете. Части _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)
8
ответ дан 5 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: