为什么runtime.GOMAXPROCS(8)比GOMAXPROCS(1)消耗更多时间?

问题描述 投票:0回答:1

我想弄清楚 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秒。很奇怪。

go concurrency
1个回答
0
投票

我根据上面的答案做了一点小小的改变。结果正如预期的那样。

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
© www.soinside.com 2019 - 2024. All rights reserved.