先看标准库中的time package benchmark的指标变化:
1 | Changes in the time package benchmarks: |
数据来源: https://github.com/golang/go/commit/6becb033341602f2df9d7c55cc23e64b925bbee2
从基准测试结果中可以看到,After函数从老版本的1.63ms直接下降到了0.11ms,提升相当恐怖。
我个人对于此次优化的粗浅理解是:
在1.14之前,标准库会在在创建Timer时懒创建goroutinue,全局最多创建64个,这些goroutinue创建好后永远不会退出,每个goroutinue中有一个最小堆,管理着一部分定时器,这些goroutinue会给Go的线程调度模型带来非常大的开销。
而1.14则直接在P上管理Timer,这样调度器在每次调度循环的间隙都可以检查是否有超时的timer需要执行,并且可以通过netpoll进行唤醒,有点类似于epoll的事件驱动模型中的定时器管理。
具体的分析可以看欧长坤大佬对于Go 1.14定时器优化的分析:
- Go夜读: 第 74 期 time.Timer 源码分析 (Go 1.14) #541
- 相关的文章: 17.2 time 的计时器 Timer | Go Under The Hood
- Go夜读在b站的视频: #74 Go time.Timer 源码分析(Go1.14)
本文完,作者yoko,尊重劳动人民成果,转载请注明原文出处: https://pengrl.com/p/20021/