为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
呼如林 2021-07-06 13:01:34
我已经建立了一个流行的数学模型,它在 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 float64for 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)}任何想法都非常感谢。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

并行化一组计算密集型计算要求并行计算实际上可以在您的机器上并行运行。如果他们不这样做,那么创建 goroutine、通道和读取通道的额外开销将使程序运行得更慢。

我猜这是这里的问题。

在运行代码之前,尝试将 GOMAXPROCS 环境变量设置为您拥有的 CPU 数量。或者在开始并行计算之前调用 runtime.GOMAXRPROCS(runtime.NumCPU())。


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 449 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信