Оказывается, вы не хотите, чтобы компилятор пытался распараллелить все , потому что тогда вы теряете время на координацию усилий даже при выполнении чего-то простого, например,
(map add1 '(1 2 3))
, что было бы быстрее сделать в одном потоке. Тем не менее, многие функциональные языки в наши дни упрощают эту параллель, когда «add1» на самом деле «очень длинное вычисление». У каждого языка свой подход, но я бы порекомендовал воспользоваться несколькими ядрами в Racket, используя фьючерсы.
Несмотря на то, что компилятор сам решает вопросы автоматически, это неплохой компромисс: заменить «карту» на «pmap», где вы думаете, что это может помочь, а не справляться с замедлением в других местах, поскольку компилятор слишком амбициозен .
Что-то простое, как
(define (pmap f xs)
(map touch (map (λ(x) (future (λ() (f x)))) xs)))
может сделать вас довольно далеко при разумном использовании, но вы должны поэкспериментировать с разбивкой ваших данных на параллельные потоки.