来自Simon Marlow的Parallel and Concurrent Haskell,他展示了以下示例(rpar.hs
):
fib :: Integer -> Integer
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
main = do
[n] <- getArgs
let test = [test1,test2,test3,test4] !! (read n - 1)
t0 <- getCurrentTime
r <- evaluate (runEval test)
printTimeSince t0
print r
printTimeSince t0
test2 = do
x <- rpar (fib 36)
y <- rseq (fib 35)
return (x,y)
从命令行键入以下内容将在两个核心上运行第二个测试:
$rpar 2 +RTS -N2
time: 0.73s
(24157817,14930352)
time: 1.90s
据我了解,第一次表示完成rseq (fib 35)
所用的时间。然后,调用print r
会导致rpar (fib 36)
的完整评估。
如果该解释是正确的,那么fib 36
的计算似乎无法重新使用已经计算的fib 35
。换句话说,所有的工作,即计算fib 35
,都必须执行两次。
这种理解是否正确?请更正或详细说明我错过的任何内容。