GHC探查器输出

时间:2017-06-19 07:59:17

标签: haskell profiling ghc

我一直在讨论Haskell中的空间泄漏的blog,并且一直试图理解ghc探测器提供的图形输出(在使用hp2ps之后)

具体来说,这是我正在查看的代码:

File Id: C:/my_files/00_Roll_Tom-values.txt

#RakeBoss-Random as on 12/19/2016
[groups]
met = chk\rel_io_chk, chk\dev_op_io,
div = chk\kzhr2x, chk\zz52t0, chk\czzjrt
rakeonly = chk\rzgnsd, chk\cztw5h

[/]
@met = rw
@div = rw
@rakeonly = r

File Id: C:/my_files/Rander-values.txt

#RakeBoss-Jan 21st QA
[groups]
met = chk\rel_io_chk, chk\dev_op_io
div = chk\541kmj, chk\zz52t0
app_only = chk\zz9ycd
check_io = chk\wder4, chk\zz9ycd
div_write = chk\lo98j3
year_on = chk\3w345f
[/]
@met = rw
@div = rw
@app_only= r
@check_io = r
@div_write = rw
@year_on = r

[/wedmin]
@check_io = rw
div_write= rw

[/doc/prod]
@div = rw
@app_only = r
year_on = rw

File Id: C:/my_files/456_Milo_123-values.txt

#RakeBoss-Jan 21st Prod
[groups]
met = chk\rel_io_chk, chk\dev_op_io
div = chk\kzhr2x, chk\zz52t0, chk\czzjrt, chk\pzjwr3
jee_only = chk\zz9ycd, chk\hz659l, chk\zzktgj, 
check_io = chk\8u7y01, chk\zz9ycd
unique_key = chk\zz9ycd
year_on = chk\dytg6
[/]
@met = rw
@div = rw
@rakeonly = r

[/Release]
@check_io = rw
@unique_key = rw

[/Redmine/Treehub]
@div = r
@jee_only = rw

.............
...................
............. so on separated by File Id:

我用-hb标志运行程序,用于堆的传记分析:

Biographical profile of heap

我无法理解为什么在void类别中考虑了这么多内存,因为它意味着大量内存被分配给从未使用过的对象。我将生产者配置文件限制为只有void组件获取生产者配置文件的输出限制为void组件:

hc output restricted to void

是否有某种方法可以找出导致空洞使用的确切形成的是什么?

1 个答案:

答案 0 :(得分:1)

使用更多(本地)变量。取代

main = print (f [1..4000000] (0 :: Int, 1 :: Int))

main = print (f list (0 :: Int, 1 :: Int))
   where
   list = [1..4000000]

通过这种方式,您将看到一个条目main.list/main/Main.CAF,显示4M长列表的确切空间。您可能会发现它占用了大量空间,因为它被默认为[Integer]。将其定义为[Int]以改善空间。

此外,f/main/...已经显示在您自己的帖子中占用了大量空间。实际上,它类似于左边的非严格折叠,其表现不佳。

让事情变得更加严格,我们得到了

f [] c = c   
f (x:xs) c = f xs $! tick x c 

tick x (c0,c1) | even x = (,) c0 $! c1+1
               | otherwise = ((,) $! c0+1) c1

现在代码在恒定时间内运行,即使不使用Int

如果我们使用-O2开启优化,GHC 8.0.1也会自动执行此优化。

但是,一般情况下,使用显式类型注释是个好主意,因此GHC不会引入不需要/不需要的多态,并执行更好的类型检查。一般而言,这也可以触发更多优化。