GHC分析器输出中的Demangling类型类函数

在分析用GHC编写的Haskell程序时,typeclass函数的名称会在.prof文件中被破坏,以区分一个实例与另一个实例的实现。 我该如何取消这些名称以找出它是哪种类型的实例?

例如,假设我有以下程序,其中FastSlow两个类型都实现了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_an9Slow的执行show ,而不是Fast的?


不,你不能。 _an9_anx部分是随机生成的。 (当我再次编译时,我得到了_ane_anC 。)

您可以使用SCC (设置成本中心)编译指示手动插入成本中心:

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)
链接地址: http://www.djcxy.com/p/43209.html

上一篇: Demangling typeclass functions in GHC profiler output

下一篇: Static types, polymorphism and specialization