Concurrency F中的并行处理#

Concurrency F中的并行处理#,concurrency,f#,Concurrency,F#,我在F#中玩async。这看起来对吗,还是我弄坏了东西 let time f = let before = System.DateTime.Now f () |> ignore let after = System.DateTime.Now after - before;; let rec fib = function 0 | 1 -> 1 | n -> fib (n - 1) + fib (

我在F#中玩
async
。这看起来对吗,还是我弄坏了东西

let time f = 
    let before = System.DateTime.Now
    f () |> ignore
    let after = System.DateTime.Now
    after - before;;

let rec fib = function 0 | 1 -> 1
                         | n -> fib (n - 1) + fib (n - 2);;

let source = [45; 40; 45; 40]

let synchronous = time <| fun () -> List.map fib source

let para = time <| fun () -> source
                             |> List.map (fun n -> async {ignore <| fib n}) 
                             |> Async.Parallel
                             |> Async.RunSynchronously

首先,使用
async
进行并行CPU处理有点反模式。有关更多信息,请参见以下问题和答案:

其次,您的
fib
函数应该重新编写为尾部递归函数,下面是一个示例(包括更改为
BigInt
):

最后,完整代码:

let source = [| 45I; 40I; 45I; 40I |]

let sync = time <| fun () -> Array.map fib source

let para = time <| fun () -> Array.Parallel.map fib source
用法保持不变,但现在显示结果:

printfn "Sync: %A in %ims" (fst sync) (snd sync)
printfn "Para: %A in %ims" (fst para) (snd para)

也许这适合codereview.stackexchange.com?ildjarn让foo=async{3+4}怎么样。它给出警告FS0020:
3+4
应该有类型单位。@Rosarch:
let foo=async{return(3+4)}
是的,我只是扔掉了结果,因为我不关心计算;到底花了多长时间。使用F#电源组中的PSeq怎么样?当然,如果您有比
map
更复杂的事情要做,您可以使用它。就目前情况而言,我们在这里得到的是最有效的解决您的特定问题的方法。进一步阅读:(Tomas的第二个答案,以及链接的博客)。
let source = [| 45I; 40I; 45I; 40I |]

let sync = time <| fun () -> Array.map fib source

let para = time <| fun () -> Array.Parallel.map fib source
let time f = 
    let watch = new System.Diagnostics.Stopwatch()
    watch.Start()
    let res = f ()
    watch.Stop()
    (res, watch.ElapsedMilliseconds)
printfn "Sync: %A in %ims" (fst sync) (snd sync)
printfn "Para: %A in %ims" (fst para) (snd para)