haskell – GHC分析器输出

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

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

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

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)

我使用-hb标志运行程序以进行堆的传记分析:

《haskell – GHC分析器输出》

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

《haskell – GHC分析器输出》

有没有办法找出究竟是什么形成的thunks导致空洞使用?

最佳答案 使用更多(本地)变量.更换

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不会引入不需要/不需要的多态,并执行更好的类型检查.一般而言,这也可能引发更多优化.

点赞