我尝试在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(大约一分钟)。
答案 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