Data.Function.Memoize的memoFix本身不释放内存

时间:2014-07-22 20:26:12

标签: haskell garbage-collection memoization

我想知道为什么GC永远不会为main = memo_main释放内存。如果main = slow_main,那么每次进入37时计算都会花费相同的时间。因此,我预期的行为是每次顶级memoFix返回时内存分配减少。然而,它仍然停留在370 MB。

module Main where

import Data.Function.Memoize

memo_fib :: (Int -> Int) -> Int -> Int
memo_fib _ 0 = 1
memo_fib _ 1 = 1
memo_fib f n = f (n-1) + f (n-2)

memo_main = interact $ unlines . map (\x -> show $ memoFix memo_fib $ read x) . lines

slow_fib 0 = 1
slow_fib 1 = 1
slow_fib n = slow_fib (n-1) + slow_fib (n-2)

slow_main = interact $ unlines . map (\x -> show $ slow_fib $ read x) . lines

main :: IO ()
main = memo_main

UPD:已解决。内存实际上已释放,但未返回到操作系统。这是GHC RTS的每个设计。

1 个答案:

答案 0 :(得分:2)

只是几个笔记:

您是在编译优化吗?优化可能导致memoFix memo_fib被提升出lambda,因为它不依赖于x,因此在所有调用中共享备忘录表。

要记住的另一件事是GHC运行时永远不会缩小堆。一旦它分配了一定数量的内存,GC就会收集它,但要保留它以供程序的其他部分使用,而不是将其释放到操作系统。所以GC可能会收集这个,但你不会用你正在使用的任何工具来看它。