使用并行策略我有一个函数frequencyBy
,我想并行。这里有个简单的测试案例:如何在Haskell
import Control.Parallel.Strategies
import Control.DeepSeq
import System.Environment
frequencyBy :: (a -> b -> Bool) -> [a] -> [b] -> [(a,Int)]
frequencyBy f as bs = map
(\a ->(a, foldr (\b -> if f a b then (+) 1 else id) 0 bs)) as
main :: IO()
main = do
x:xs <- getArgs
let result = frequencyBy (==) [1::Int .. 10000] [1 .. (read x)] `using`
parList rdeepseq
print $ product $ map snd $ result
我想在frequencyBy
并行运行的map
。我试图使用parList rdeepseq
来实现这一点(main
中的所有其他内容仅用于确保不是所有内容都得到了优化)。但是,这不起作用,两个线程的工作量是一个线程在同一时间内的两倍。我不明白我在这里做错了什么。
如果两个线程做两倍的同时多的工作,一个线程,并不意味着它是正确parallelising? – ehird 2012-01-13 14:57:59