我正在尝试使用 goroutine 来并行化一些计算。但是,goroutine 的执行时间让我很困惑。我的实验设置很简单。
runtime.GOMAXPROCS(3)
datalen := 1000000000
data21 := make([]float64, datalen)
data22 := make([]float64, datalen)
data23 := make([]float64, datalen)
t := time.Now()
res := make(chan interface{}, dlen)
go func() {
for i := 0; i < datalen; i++ {
data22[i] = math.Sqrt(13)
}
res <- true
}()
go func() {
for i := 0; i < datalen; i++ {
data22[i] = math.Sqrt(13)
}
res <- true
}()
go func() {
for i := 0; i < datalen; i++ {
data22[i] = math.Sqrt(13)
}
res <- true
}()
for i:=0; i<3; i++ {
<-res
}
fmt.Printf("The parallel for loop took %v to run.\n", time.Since(t))
请注意,我在 3 个 goroutine 中加载了相同的数据,该程序的执行时间为
The parallel for loop took 7.436060182s to run.
但是,如果我让每个 goroutine 处理不同的数据,如下所示:
runtime.GOMAXPROCS(3)
datalen := 1000000000
data21 := make([]float64, datalen)
data22 := make([]float64, datalen)
data23 := make([]float64, datalen)
t := time.Now()
res := make(chan interface{}, dlen)
go func() {
for i := 0; i < datalen; i++ {
data21[i] = math.Sqrt(13)
}
res <- true
}()
go func() {
for i := 0; i < datalen; i++ {
data22[i] = math.Sqrt(13)
}
res <- true
}()
go func() {
for i := 0; i < datalen; i++ {
data23[i] = math.Sqrt(13)
}
res <- true
}()
for i:=0; i<3; i++ {
<-res
}
fmt.Printf("The parallel for loop took %v to run.\n", time.Since(t))
这个的执行时间几乎是之前的 3 倍,几乎等于/比没有 goroutine 的顺序执行更糟
The parallel for loop took 20.744438468s to run.
我想也许我以错误的方式使用了 goroutine。那么使用多个 goroutine 处理不同数据的正确方法应该是什么?
幕布斯7119047
心有法竹
相关分类