Использование F # async
для чисто связанных с ЦП задач работает только в том случае, если задачи выполняют более сложную операцию.Если вы пытаетесь распараллелить код, который делает что-то очень простое, то лучше использовать PLINQ (и библиотеку параллельных задач), которая более оптимизирована для подобных задач.
Однако даже тогдаполучить ускорение в тривиальном случае, как тот, который у вас есть, сложно.Если вы хотите поэкспериментировать с этим немного больше, вы можете попробовать это:
// Turn on timing in F# interactive
#time
let data = [| 1 .. 5000000*3 |]
// Use standard 'map' function for arrays
let result = Array.map (fun x -> (x * x) / 75) data
// Use optimized parallel version
let result = Array.Parallel.map (fun x -> (x * x) / 75) data
Обратите внимание, что использование Array.map
само по себе намного быстрее, чем использование выражений последовательности, а затем преобразование результата в массив.Если вы хотите использовать более сложные операции, чем сопоставление, то F # PowerPack содержит модуль PSeq
с функциями, аналогичными тем, которые есть в Seq
или List
:
#r @"FSharp.PowerPack.Parallel.Seq.dll"
data
|> PSeq.map (fun a -> ...)
|> PSeq.filter (fun a -> ...)
|> PSeq.sort
|> Array.ofSeq
Если вы хотите узнать больше об этомЯ недавно написал серию блогов о параллельном программировании на F # .