Пожалуйста, помогите понять параллель Haskell - PullRequest
1 голос
/ 13 апреля 2019

Я прочитал несколько документов, используя в качестве примера Фибоначчи.Затем я начал пытаться распараллелить мой код, в основном работая со списком.Мой код не стал работать быстрее.

Пример кода:

parMap :: (a -> b) -> [a] -> [b]
parMap f = withStrategy (parList rseq) . map f

parZipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
parZipWith f as = withStrategy (parList rseq) . zipWith f as

main = do
  let rips = parMap parseIPRange [] -- huge list of items like "192.168.3.1/24"
      result = parZipWith checkSubnets rips (tail rips ++ [IPRange 0 0])
  print result

Я думаю, что, должно быть, я все неправильно понял.

PS: Все дело в миграцииhttps://github.com/magicloud/ip_helper,, что Руст с Районом.

1 Ответ

4 голосов
/ 13 апреля 2019

Следуя совету @ATayler, я сделал следующие изменения.

  1. Включить DeriveGeneric
  2. Импорт GHC.Generics
  3. Извлечение Generic для всехмои типы.
  4. Сделать нужные мне функции:
parMap :: (NFData b) => (a -> b) -> [a] -> [b]
parMap f = withStrategy (parList rdeepseq). map f
parFilter :: (NFData a) => (a -> Bool) -> [a] -> [a]
parFilter f = withStrategy (parList rdeepseq) . filter f
parZipWith :: (NFData c) => (a -> b -> c) -> [a] -> [b] -> [c]
parZipWith f as = withStrategy (parList rdeepseq). zipWith f as
parSortBy :: (NFData a) => (a -> a -> Ordering) -> [a] -> [a]
parSortBy f = withStrategy (parList rdeepseq) . sortBy f
При необходимости вызывайте их.

Теперь время сокращено до 1/3 от исходного однопоточного с полным использованием ЦП.Не уверен, что могут быть другие важные оптимизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...