Concurrency F中的并行处理#
我在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 (
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)