Golang Go语言中 runtime.GOMAXPROCS 的设置问题

发布于 1周前 作者 htzhanglong 来自 Go语言

老哥们,我把代码中的 runtime.GOMAXPROCS(1) 注释掉了,可是程序运行下来的时间根本没减少,这是为什么?
真是百思不得骑呐

package main

import ( “fmt” “time” “runtime” )

var quit chan int = make(chan int)

func loop() { for i := 0; i < 10000; i++ { fmt.Printf("%d\n ", i) } quit <- 0 }

func main() { fmt.Println(runtime.NumCPU()) time.Sleep(time.Second) a := 500 t1 := time.Now() runtime.GOMAXPROCS(1) //单核跑和把这句话注释吊(使用默认 CPU 个数)跑下来时间没差,这是为什么?

for i := 1; i &lt;= a; i++ {
	go loop()
}

for i := 0; i &lt; a; i++ {
	&lt;-quit
}
elapsed := time.Since(t1)
fmt.Println("运行时间:", elapsed)

}

// 下面是 GOMAXPROCS 的说明

// GOMAXPROCS sets the maximum number of CPUs that can be executing
// simultaneously and returns the previous setting. If n < 1, it does not
// change the current setting.
// The number of logical CPUs on the local machine can be queried with NumCPU.
// This call will go away when the scheduler improves.

Golang Go语言中 runtime.GOMAXPROCS 的设置问题

更多关于Golang Go语言中 runtime.GOMAXPROCS 的设置问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

计算太短了,尝试 a 大一点看看.多测试几次做对比

更多关于Golang Go语言中 runtime.GOMAXPROCS 的设置问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 我把 a 改成了 5000, 发现使用默认 CPU(4 个)要比使用使用 1 个 CPU 要慢 16s. ???哇!这也太恐怖啦吧

,h4lbhg1G ,ysc3839 .强行艾特

多核不一定会快,要看你程序到底能不能并行,
你这里用了一个 channel,瓶颈就在这里,放在多核上跑反而会变慢
建议看一下 rob pike 的 Concurrency is not parallelism http://talks.golang.org/2012/waza.slide

就算是万核你也只有一个 stdout 啊, 最后还是单线程输出到屏幕上。
fmt.Printf("%d\n ", i) 注释掉,改为其他运算

#3 你找错人了吧?我不懂 Golang。

stdout 只有一个,并发访问同一资源产生了数据竞争,大部分时间都花在了同步锁上。

感谢 2 位大大,十分感谢!

在Go语言中,runtime.GOMAXPROCS函数用于设置程序同时运行的逻辑处理器(goroutines)的数量。这个设置对于优化并发程序的性能至关重要。

默认情况下,runtime.GOMAXPROCS的值被设置为宿主机的CPU核心数。这意味着如果你的机器有4个CPU核心,Go程序会尝试同时使用这4个核心来运行goroutines。

然而,在某些情况下,你可能需要手动调整这个值。例如,如果你的程序包含大量I/O操作,增加GOMAXPROCS的值可能会提高性能,因为更多的goroutines可以并行执行I/O等待操作。相反,如果程序主要是计算密集型,且goroutines之间存在大量的同步等待,增加GOMAXPROCS可能不会带来性能提升,反而可能因上下文切换导致性能下降。

设置runtime.GOMAXPROCS的示例代码如下:

package main

import (
    "fmt"
    "runtime"
)

func main() {
    // 设置最大处理器数为8
    runtime.GOMAXPROCS(8)
    fmt.Println("GOMAXPROCS set to:", runtime.GOMAXPROCS(0))
}

注意,runtime.GOMAXPROCS(0)会返回当前的GOMAXPROCS设置值,而不是修改它。

总之,合理设置runtime.GOMAXPROCS值对于充分利用多核CPU资源、优化Go程序的并发性能具有重要意义。但在调整时,需根据程序的具体特点进行权衡和测试。

回到顶部