У меня есть функция 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
Я хотел бы запустить ] map
в frequencyBy
параллельно. Я пытаюсь добиться этого, используя parList rdeepseq
(все остальное в main
просто для того, чтобы все оптимизировано). Однако это не работает, два потока выполняют в два раза больше работы, чем один поток за одно и то же время. Я не понимаю, что я здесь делаю не так.