我想了解Haskell评估策略,并发现parBuffer
概念非常有趣。所以我创建了一个计算阶乘的哑函数,并尝试创建它的并行版本。
考虑以下代码
module Main where
import System.Environment
import Control.Parallel.Strategies
fac :: Int -> Int
fac n
| n <= 1 = 1
| otherwise = n * fac (n-1)
-- sequential version
facsum :: Int -> Int
facsum n = sum $ map fac [1..n]
facsum_par :: Int -> Int
facsum_par n = sum lst where
lst = (map fac [1..n]) `using` parBuffer 50 rseq
main :: IO ()
main = do args <- getArgs
let (n:_) = args
print (facsum_par $ read n)
我原以为,parBuffer会创建50个火花串,但* n = 9000和-N2的统计数据我得到输出
SPARKS:9000(8277转换,688溢出,0哑,1 GC,34失败)
为什么会出现溢出的火花?据我所知,只有当火花量大于火花池的大小时才会发生这种情况,但这应该限制在50?
为什么会有34个失败的火花,是否仅适用于小型,快速计算的输入?