我使用的是 go 语言的 go1.5.3 linux/amd64 版本。我有一个执行需要一些时间的数学运算的 go 例程。每个 goroutine 独立运行,不必阻塞。我的系统有 12 个内核。如果我生成 12 个 go 例程,它只需要所有内核的平均使用率高达 31%。如果我使用 24 个 go 例程,它会使所有内核的平均使用率达到 49%。如果我使用 240,我得到 77%。2400 给了我 76%。显然, rand.Intn(j) 操作正在减慢它的速度。没有它,内核将以 100% 的速度运行。func DoSomeMath() int { k := 0 for i := 0; i < 1000; i++ { j := i*i + 2 k += i * rand.Intn(j) } return k}在使用 RNG 时,如何让程序以 100% 的速度使用所有内核?
2 回答
收到一只叮咚
TA贡献1821条经验 获得超4个赞
换句话说,有谎言、该死的谎言和基准。
尽管被问到,您仍然没有发布重现问题所需的代码:如何创建最小、完整和可验证的示例。
这是一个可重复的基准测试,它使用 PRNG,它应该使您的 CPU 接近 100%:
package main
import (
"math/rand"
"runtime"
"time"
)
func DoSomeCPU(done <-chan bool) {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
k := 0
for i := 0; i < 1000000; i++ {
j := i*i + 2
k += i * r.Intn(j)
}
_ = k
<-done
}
func main() {
numCPU := runtime.NumCPU()
runtime.GOMAXPROCS(numCPU)
done := make(chan bool, 2*numCPU)
for {
done <- true
go DoSomeCPU(done)
}
}
运行这段代码会得到什么结果?
- 2 回答
- 0 关注
- 186 浏览
添加回答
举报
0/150
提交
取消