我在 Go 中做一些实验,我发现了一些非常奇怪的东西。当我在我的计算机上运行以下代码时,它会在 ~0.5 秒内执行。
package main
import (
"fmt"
"runtime"
"time"
)
func waitAround(die chan bool) {
<- die
}
func main() {
var startMemory runtime.MemStats
runtime.ReadMemStats(&startMemory)
start := time.Now()
cpus := runtime.NumCPU()
runtime.GOMAXPROCS(cpus)
die := make(chan bool)
count := 100000
for i := 0; i < count; i++ {
go waitAround(die)
}
elapsed := time.Since(start)
var endMemory runtime.MemStats
runtime.ReadMemStats(&endMemory)
fmt.Printf("Started %d goroutines\n%d CPUs\n%f seconds\n",
count, cpus, elapsed.Seconds())
fmt.Printf("Memory before %d\nmemory after %d\n", startMemory.Alloc,
endMemory.Alloc)
fmt.Printf("%d goroutines running\n", runtime.NumGoroutine())
fmt.Printf("%d bytes per goroutine\n", (endMemory.Alloc - startMemory.Alloc)/uint64(runtime.NumGoroutine()))
close(die)
}
但是,当我使用runtime.GOMAXPROCS(1)
它执行它时,它的执行速度要快得多(~0.15 秒)。谁能向我解释为什么使用更多内核运行许多 goroutine 会更慢?将 goroutine 多路复用到多个内核是否有任何重大开销?我意识到 goroutine 没有做任何事情,如果我不得不等待例程实际做某事,那可能会是另一回事。