Возможно, что накладные расходы замедляют процесс, в зависимости от того, насколько велик x ; если работа, которую вы выполняете в каждой искре, сопоставима со временем, которое требуется для создания каждой искры (и, конечно, есть планирование накладных расходов и т. д.), тогда у вас возникнут проблемы.
Вы можете попробовать parListChunk
, например parListChunk 64 rdeepseq
; вам придется поэкспериментировать, чтобы выяснить, какой размер куска использовать. В то время как ваша текущая стратегия создает искру для каждого элемента списка, parListChunk
создает искру для каждого блока определенного размера в списке и использует указанную вами стратегию последовательно для каждого элемента этого блока.
Кстати, foldr
в frequencyBy
, вероятно, замедляет работу из-за чрезмерного создания грома; что-то вроде
frequencyBy :: (a -> b -> Bool) -> [a] -> [b] -> [(a,Int)]
frequencyBy f as bs = map (\a -> (a, sum . map (const 1) . filter (f a) $ bs)) as
должен это исправить.
Конечно, как всегда, убедитесь, что вы компилируете с -O2
и работаете с +RTS -N
.