我有一个相当简单的 Go 程序,旨在计算随机斐波那契数以测试我在我编写的工作池中观察到的一些奇怪行为。当我分配一个线程时,程序在 1.78 秒内完成。当我分配 4 时,它在 9.88 秒内完成。
代码如下:
var workerWG sync.WaitGroup
func worker(fibNum chan int) {
for {
var tgt = <-fibNum
workerWG.Add(1)
var a, b float64 = 0, 1
for i := 0; i < tgt; i++ {
a, b = a+b, a
}
workerWG.Done()
}
}
func main() {
rand.Seed(time.Now().UnixNano())
runtime.GOMAXPROCS(1) // LINE IN QUESTION
var fibNum = make(chan int)
for i := 0; i < 4; i++ {
go worker(fibNum)
}
for i := 0; i < 500000; i++ {
fibNum <- rand.Intn(1000)
}
workerWG.Wait()
}
如果我替换runtime.GOMAXPROCS(1)为4,则程序的运行时间是原来的四倍。
这里发生了什么?为什么向工作池添加更多可用线程会使整个池变慢?
我个人的理论是,它与工人的处理时间少于线程管理的开销有关,但我不确定。我的预订是由以下测试引起的:
当我用worker以下代码替换函数时:
for {
<-fibNum
time.Sleep(500 * time.Millisecond)
}
一个可用线程和四个可用线程占用的时间相同。
婷婷同学_
慕丝7291255
慕容708150
相关分类