len*_*dor 6 memory optimization haskell map ghc
这个简单的程序在编译时没有带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]
Run Code Online (Sandbox Code Playgroud)
使用ghc -O2编译时,内存使用量超过系统资源(8GB).
将主要更改为:
main = do putStrLn $ show $ foldl' (+) 0 [g 0, g 1]
Run Code Online (Sandbox Code Playgroud)
缓解问题所以它似乎与地图有关.
任何人都可以解释这种行为,也许可以解决这个问题?
GHC版本是:格拉斯哥Haskell编译器,版本7.4.1,第2阶段由GHC版本7.4.1启动
Car*_*arl 11
这是完全懒惰的"优化"咬你.当它正常工作时,它可以提供运行时间的渐近改进.当它工作错误时......会发生这种情况.
完全惰性变换将常量移出绑定到封闭范围的常量.在这种情况下,它会获取[1..(1073741824-1)]常量,并将其移动到封闭范围.但是,这是完全错误的.它导致它在两个调用之间共享,这意味着它无法在第一次有效地流式传输.
除了没有-O2的编译之外,没有可靠的方法可以打败完整的懒惰转换.