为什么下面的并行数组版本比常规版本慢

时间:2015-10-15 10:34:35

标签: .net parallel-processing f#

我正在研究使用多个核心加速处理大型数据集。以下测试代码产生了令人惊讶的结果,即并行代码版本比单核实现慢大约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)的更复杂的函数,并获得了预期的结果 - 并行速度更快。

1 个答案:

答案 0 :(得分:4)

当您执行并行操作时,每个任务都会有一些开销,例如,必须将每个任务分派到一个线程,然后收集结果。

串联,开销更少。

当任务像x*10一样简单。开销占主导地位。

对于更复杂的任务,并行将更快