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
./file單個+ RTS -sData.MemoCombinators;意想不到的運行時間
產量
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' 80000
後不會丟棄fib'
,並且可以用來直接給出第二個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
的範圍內而被丟棄。
800 MB對我有意義,因爲查找表必須被構建兩次。然而,爲什麼它需要14.22s而不是2.78s?我預計大約兩倍,約。 5.8S。
在GC中花費了多少時間?你用-O2編譯過嗎? – augustss