在GHC分析器输出Demangling类型类功能
-
25-09-2019 - |
题
当仿形写入GHC一个Haskell程序,的类型类函数的名称错位在.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
(设定成本中心)编译指示手动插入一个成本中心:
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)
不隶属于 StackOverflow