我有一个函数frequencyBy
,我想并行化它。以下是一个简单的测试案例:
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
中的所有其他内容只是为了确保不会优化掉所有东西)。然而,这并不起作用,两个线程在相同的时间内做的工作量是一个线程的两倍。我不理解我在这里做错了什么。