我正在研究使用多个核心加速处理大型数据集。以下测试代码产生了令人惊讶的结果,即并行代码版本比单核实现慢大约3倍。为什么会这样?
[<EntryPoint>]
let main argv =
let n = 200000000
let xs = [|1..n|]
let stopWatch = System.Diagnostics.Stopwatch()
stopWatch.Start()
let ys1 = xs |> Array.map (fun x -> x * 10)
stopWatch.Stop()
printfn "%A" stopWatch.Elapsed
System.GC.Collect(2)
let stopWatch = System.Diagnostics.Stopwatch()
stopWatch.Start()
let ys2 = xs |> Array.Parallel.map (fun x -> x * 10)
stopWatch.Stop()
printfn "%A" stopWatch.Elapsed
printfn "%A" argv
0 // return an integer exit code
结果如下:
00:00:00.3471365
00:00:00.9448111
[||]
按任意键继续。 。
我已将编译选项设置为64位应用程序,并优先选择优化。
根据下面的建议,我将lambda函数更改为类似于exp(100.78 + sin x + 89.6*log x)
的更复杂的函数,并获得了预期的结果 - 并行速度更快。
答案 0 :(得分:4)
当您执行并行操作时,每个任务都会有一些开销,例如,必须将每个任务分派到一个线程,然后收集结果。
串联,开销更少。
当任务像x*10
一样简单。开销占主导地位。
对于更复杂的任务,并行将更快