Haskell使用-O2进行编译会大大增加内存使用量

当用ghc编译没有标志的情况时,此简单程序将在恒定的内存空间中运行:

import Data.List
f x = x*x
g a = foldl' (+) (f a) [1..(1073741824-1)]
main = do putStrLn $ show $ foldl' (+) 0 $ map g [0,1]

使用ghc -O2编译时,内存使用量超过了系统资源(8GB)。

将main更改为:

main = do putStrLn $ show $ foldl' (+) 0 [g 0, g 1]

减轻了问题,因此似乎与地图有关。

任何人都可以解释这种行为,也许可以解决它吗?

GHC版本是:Glasgow Haskell编译器,版本7.4.1,由GHC版本7.4.1引导的第2阶段。

卡尔

这是对您的完全懒惰“优化”。如果运行正常,它可以在运行时间上提供渐近的改进。当它发生错误时...发生这种情况。

完全惰性转换将常量从绑定中移出到封闭范围。在这种情况下,它将选择[1..(1073741824-1)]常量,并将其移至封闭范围。但是,那是完全错误的。它导致它在两个调用之间共享,这意味着它不能在第一时间有效地进行流传输。

除了不使用-O2进行编译以外,没有可靠的方法可以克服完全的惰性转换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章