“Async.Parallel”结构真的有助于在多核系统上加快计算速度吗? .NET TPL“任务”是否以某种方式涉及?
open System;
let key = Console.ReadKey(true);
let start = System.DateTime.Now
let pmap f l = seq { for a in l do yield async {return f a} } |> Async.Parallel |> Async.RunSynchronously
let map f l = seq {for a in l do yield f a}
let work f l =
match key.KeyChar with
| '1' -> pmap f l
| '2' -> Seq.toArray (map f l)
| _ -> [||]
let result = work (fun x -> (x * x) / 75) (seq { 1 .. 100000*3})
let endtime = DateTime.Now - start
printfn "%A"endtime;
let pause = Console.ReadKey(true);
我想你们中的一些人会从理论上解释它,但我也会感谢一些现实世界的测试。
最佳答案
使用 F# async
对于纯 CPU 密集型任务,仅当任务执行一些更复杂的操作时才有效。如果您尝试并行化执行非常简单的代码,那么最好使用 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
如果您想了解更多相关信息,我写了一个关于 parallel programming in F# 的博客系列。最近。
关于f# - F# Async.Parallel 会加快计算速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4851745/