Go-lang 并行段运行速度比串行段慢

我已经建立了一个流行的数学模型,它在 Go 中的计算量相当大。我现在正在尝试构建一组系统来测试我的模型,在那里我更改输入并期望不同的输出。我构建了一个系列版本,以缓慢增加艾滋病毒流行率并查看对艾滋病毒死亡的影响。运行大约需要 200 毫秒。


for q = 0.0; q < 1000; q++ {


    inputs.CountryProfile.HivPrevalenceAdultsByGroup[0] = inputs.CountryProfile.HivPrevalenceAdultsByGroup[0] * float32(math.Pow(1.00001, q))

    results := costAnalysisHandler(inputs)

    fmt.Println(results.HivDeaths[20])


}

然后我使用通道制作了一个“并行”版本,它需要更长的时间,大约 400 毫秒才能运行。这些小的变化很重要,因为我们将使用不同的输入运行数百万次,因此希望使其尽可能高效。这是并行版本:


ch := make(chan ChData)

var q float64

for q = 0.0; q < 1000; q++ {

    go func(q float64, inputs *costanalysis.Inputs, ch chan ChData) {

        inputs.CountryProfile.HivPrevalenceAdultsByGroup[0] = inputs.CountryProfile.HivPrevalenceAdultsByGroup[0] * float32(math.Pow(1.00001, q))

        results := costAnalysisHandler(inputs)

        fmt.Println(results.HivDeaths[20])

        ch <- ChData{int(q), results.HivDeaths[20]}

    }(q, inputs, ch)

}

for q = 0.0; q < 1000; q++ {

    theResults := <-ch

    fmt.Println(theResults)

}

任何想法都非常感谢。


呼如林
浏览 450回答 3
3回答

MYYA

并行化一组计算密集型计算要求并行计算实际上可以在您的机器上并行运行。如果他们不这样做,那么创建 goroutine、通道和读取通道的额外开销将使程序运行得更慢。我猜这是这里的问题。在运行代码之前,尝试将 GOMAXPROCS 环境变量设置为您拥有的 CPU 数量。或者在开始并行计算之前调用 runtime.GOMAXRPROCS(runtime.NumCPU())。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go