使用並行策略我有一個函數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