package main
import (
"sync"
"testing"
)
func BenchmarkContextSwitch(b *testing.B) {
var wg sync.WaitGroup
begin := make(chan struct{})
c := make(chan struct{})
var token struct{}
sender := func() {
defer wg.Done()
<-begin
for i := 0; i < b.N; i++ {
c <- token
}
}
receiver := func() {
defer wg.Done()
<-begin
for i := 0; i < b.N; i++ {
<-c
}
}
wg.Add(2)
go sender()
go receiver()
b.StartTimer()
close(begin)
wg.Wait()
}
程序输出如下,
每个上下文切换需要 225ns ,哇 !如果你还记得 1.467us, 0.225µs 或 92% 的速度提升比我的计算机一个操作系统上下文切换还要快。 很难断言有多少goroutine 会导致上下文切换过于频繁,但是可以很轻松地说,上限很可能不会成为使用goroutine的任何障碍。
有疑问加站长微信联系(非本文作者)