f# - F# Async.Parallel 会加快计算速度吗?

标签 f# parallel-processing

“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/

相关文章:

c++ - 在 C++ 中并行重复随机生成,避免多次运行重复

f# - 将值向上转换为 _ 通配符是什么意思?

linux - 使用 Mono(开源 .NET)开发 Web 应用程序有什么例子吗?

junit - 在Eclipse中并行运行JUnit4-Tests

python - 并行过程的最佳种子

c - MPI 使用 MPI_Send 和 MPI_Reduce 发送消息

java - 如何并行执行oracle java存储过程

f# - 折叠套装以制作新套装

f# - 范围分配

F# - 将列表中的第一个字符串大写