Go1.14(即将发布)中的性能改进

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版本的发布可以让很多人缓解对协程调度不够“聪明”的担忧。

posted @ 2020-02-25 01:20  司青  阅读(4)  评论(0编辑  收藏  举报  来源