即使使用爆炸模式,ghci记忆也会增加

时间:2014-03-03 17:06:29

标签: haskell memory-management stack-overflow ghci

我尝试在Temporal correlations when employing System.Random (not present when employing System.Random.TF)中的部分代码上使用bang模式以改善内存消耗,但似乎ghci内存使用率仍以惊人的速度增长,尽管使用了爆炸模式。那就是我有代码:

{-# LANGUAGE BangPatterns #-}
module Main where
import System.Random

generateNthGenerator !startGen 0 = startGen
generateNthGenerator !startGen n = generateNthGenerator newGen (n-1)
  where newGen = snd $ ((random startGen) :: (Bool,StdGen)) 

main = do 
  print $ generateNthGenerator (mkStdGen 0) 10000000

然后将此加载到ghci并运行(通过在ghci中键入main),我发现内存使用量迅速增加。

我还观察到,对于以下爆炸模式的因子代码,这种内存增加会发生均衡,尽管速度较慢:

{-# LANGUAGE BangPatterns #-}
module Main where

getFactorialAcc 1 !acc = acc
getFactorialAcc n !acc = getFactorialAcc (n-1) (acc * n)

main = do 
  print $ getFactorialAcc 1000000 1

对于后一个代码,在突然开始增加之前,内存消耗最初保持在大约30MB(大约一分钟)。

1 个答案:

答案 0 :(得分:2)

感谢Jake McArthur(见上面的评论),在随机数生成器的情况下,包含内存使用的解决方案是将代码编写为:

{-# LANGUAGE BangPatterns #-}
module Main where
import System.Random

generateNthGenerator startGen 0 = startGen
generateNthGenerator startGen n = generateNthGenerator newGen (n-1)
  where randTuple = ((random startGen) :: (Bool,StdGen))
        !randBool = (fst randTuple)
        newGen = snd randTuple 

main = do 
  print $ generateNthGenerator (mkStdGen 0) 10000000

另外,人们可以像下面提到的Antal S-Z那样:

{-# LANGUAGE BangPatterns #-}
module Main where
import System.Random

generateNthGenerator startGen 0 = startGen
generateNthGenerator startGen n = generateNthGenerator newGen (n-1)
  where !(!_, newGen) = (random startGen) :: (Bool,StdGen)

main = do 
  print $ generateNthGenerator (mkStdGen 0) 10000000