import qualified Data.MemoCombinators as Memo
import System.Environment
single = fib' 80000
where fib' = Memo.integral fib''
fib'' 0 = 0
fib'' 1 = 1
fib'' x = fib' (x-1) + fib' (x-2)
doubleFast = fib' 80000 + fib' 80000
where fib' = Memo.integral fib''
fib'' 0 = 0
fib'' 1 = 1
fib'' x = fib' (x-1) + fib' (x-2)
doubleSlow = g 80000 + g 80000
where g x = fib' x
where fib' = Memo.integral fib''
fib'' 0 = 0
fib'' 1 = 1
fib'' x = fib' (x-1) + fib' (x-2)
main = do
args <- getArgs
case args of
["single"] -> print single
["doubleFast"] -> print doubleFast
["doubleSlow"] -> print doubleSlow
./ファイル 単一 +RTS -s
収量
1,085,072,320 bytes allocated in the heap
387,297,448 bytes copied during GC
265,811,512 bytes maximum residency (10 sample(s))
99,107,440 bytes maximum slop
433 MB total memory in use (0 MB lost due to fragmentation)
Total time 2.78s ( 2.78s elapsed)
./file doubleFast +RTS -s
同じ結果が得られます。これは私には理にかなっています:fib'
は のスコープ内にあるdoubleFast
ためfib'
、最初の計算後に破棄fib' 80000
されず、2 番目の を直接与えるために使用できますfib' 80000
。
私が理解していないのは次のとおりです。
./file doubleSlow +RTS -s
2,166,532,752 bytes allocated in the heap
551,826,896 bytes copied during GC
263,793,848 bytes maximum residency (11 sample(s))
204,460,968 bytes maximum slop
818 MB total memory in use (0 MB lost due to fragmentation)
Total time 14.22s ( 14.24s elapsed)
私が間違っている場合は修正してください:fib'
最初の を計算するために使用されますg 80000 = fib' 80000
。関数は残され、g は記憶されていないため、秒を直接g
計算するために再利用することはできません。さらに、のルックアップ テーブルの g 80000
最初の呼び出しを終了した後は、 のスコープ内にないため、 は破棄されます。g 80000
fib'
doubleSlow
ルックアップ テーブルを 2 回作成する必要があるため、800 MB は理にかなっています。しかし、なぜ 2.78 秒に比べて 14.22 秒かかるのでしょうか? 私は約2倍、約を期待していました。5.8秒。