我想弄清楚 GOMAXPROCS 对不同数量的 CPU 的影响。在我对此进行测试之前,我认为设置的CPU越多,消耗的时间就越少。但结果却恰恰相反,我也不知道为什么。
Go版本是1.20。下面是测试代码:
package main
import (
"fmt"
"math"
"runtime"
"sync"
"sync/atomic"
"time"
)
var (
a uint64
wg sync.WaitGroup
)
func main() {
runtime.GOMAXPROCS(1)
now := time.Now()
for range 10000 {
wg.Add(1)
go func() {
for range math.MaxInt16 {
atomic.AddUint64(&a, 1)
}
wg.Done()
}()
}
wg.Wait()
fmt.Println("time elapsed:", time.Since(now))
}
// 1 CPU: 1.583089959s
// 8 CPUs: 5.406806505s
使用1个CPU时,消耗约1.58秒。当使用8个CPU时,大约消耗5.40秒。很奇怪。
我根据上面的答案做了一点小小的改变。结果正如预期的那样。
package main
import (
"fmt"
"math"
"runtime"
"sync"
"sync/atomic"
"time"
)
var wg sync.WaitGroup
func main() {
runtime.GOMAXPROCS(8)
now := time.Now()
for range 10000 {
var a uint64
wg.Add(1)
go func() {
for range math.MaxInt16 {
atomic.AddUint64(&a, 1)
}
wg.Done()
}()
}
wg.Wait()
fmt.Println("time elapsed:", time.Since(now))
}
// 1 CPU: 1.574640024s
// 4 CPUs: 550.466936ms
// 8 CPUs: 457.705519ms