性能评测
协程评测
上下文切换
上下文切换,即当某个并发进程承载的某些内容必须保存其状态以切换到其他进程时。如果我们有太多的并发进程,上下文切换可能花费所有的
$ taskset -c 0 perf bench sched pipe -T
# Running 'sched/pipe' benchmark:
# Executed 1000000 pipe operations between two threads
Total time: 2.935 [sec]
2.935784 usecs/op
340624 ops/sec
这个基准测量实际上是衡量在一个线程上发送和接收消息所需的时间,所以我们将把结果分成两部分。每个上下文切换
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 //1
for i := 0; i < b.N; i++ {
c <- token //2
}
}
receiver := func() {
defer wg.Done()
<-begin //1
for i := 0; i < b.N; i++ {
<-c //3
}
}
wg.Add(2)
go sender()
go receiver()
b.StartTimer() //4
close(begin) //5
wg.Wait()
}
我们运行该基准测试,指定只使用一个
$ go test -bench=. -cpu=1 /src/gos-concurrency-building-blocks/goroutines/fig-ctx-switch_test.go
| BenchmarkContextSwitch | 5000000 | 225ns/op |
| :--------------------- | :--------------------- | :------- |
| PASS | | |
| ok | command-line-arguments | 1.393s |
Links
- https://zhuanlan.zhihu.com/p/80037638 协程究竟比线程能省多少开销?
- https://mp.weixin.qq.com/s/uWP2X6iFu7BtwjIv5H55vw
Goroutine 数量控制在多少合适,会影响GC 和调度?