Mam funkcję frequencyBy
, którą chciałbym zrównoleglić. Tu następuje prosty przypadek testowy:Jak korzystać z równoległych strategii w 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
chciałbym uruchomić map
w frequencyBy
równolegle. Próbuję to osiągnąć, używając parList rdeepseq
(wszystkie inne rzeczy w main
mają na celu upewnienie się, że nie wszystko jest zoptymalizowane). Jednak to nie działa, dwa wątki wykonują dwukrotnie więcej pracy niż jeden wątek w tym samym czasie. Nie rozumiem, co robię źle tutaj.
Jeśli dwa wątki działają dwa razy więcej niż jeden wątek w tym samym czasie, czy to nie oznacza, że jest to równoznaczne? – ehird