Go1.14即将于2020年2月底发布,这个版本有一些值得注意的性能改进,如下:
- defer
跟正常的函数调用相比,defer几乎已经没有额外的开销了。你可以在对性能极度敏感的代码中放心的使用defer
了。
- 调度器
Goroutine支持真正意义上的抢占式调度了。我们知道在老版本中,goroutine只有当遇到I/O操作、管道/同步操作或者用户主动调用了runtime.Gosched()
时才会让出执行权,而为了避免一个goroutine长期运行"饿死"其他goroutine, Go编译器还会在调用另一个函数之前埋点,即检测一下当前goroutine是否已经长时间执行以决定是否切换到其他goroutine执行。这并不是真正意义上的抢占,只是一种模拟,它有个明显的缺点,就是无法处理长时间执行且没有调用其他函数的循环体。在Go1.14版本中,除了windows-arm, darwin-arm, js-wasm, plan9平台外都将支持抢占式协程调度。
- 页分配器(Page Allocator)
Page Allocator在GOMAXPROCS
很大的情况下的锁竞争更少了。这样带来的好处是,并行分配内存时速度更快、延迟更低。
- 内置Timer
标准库内置的定时器现在更加高效了---- 减少了锁竞争和上下文切换次数。
个人感觉意义最大的当属抢占式调度的引入。之前有人在CPU密集型的任务中经常会遇到其他协程长时间得不到调度的情况,当然对于CPU密集任务来说确实不应该搞太多协程,没啥意义,但是如果是用线程来实现的话这个问题是不存在的。相信1.14版本的发布可以让很多人缓解对协程调度不够“聪明”的担忧。
网友评论