我一直在讨论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标志运行程序,用于堆的传记分析:
我无法理解为什么在void类别中考虑了这么多内存,因为它意味着大量内存被分配给从未使用过的对象。我将生产者配置文件限制为只有void组件获取生产者配置文件的输出限制为void组件:
是否有某种方法可以找出导致空洞使用的确切形成的是什么?
答案 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不会引入不需要/不需要的多态,并执行更好的类型检查。一般而言,这也可以触发更多优化。