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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Goroutine是Go里的一种轻量级线程——协程。相对线程,协程的优势就在于它非常轻量级,进行上下文切换的代价非...
    witchiman阅读 5,111评论 0 9
  • 介绍 上一篇文章我对操作系统级别的调度进行了讲解,这对理解 Go 语言的调度器是很重要的。这篇文章,我将解释下 G...
    达菲格阅读 8,352评论 1 30
  • [toc] 原文:Scheduling In Go : Part II - Go Scheduler 前言 这是本...
    豆腐匠阅读 1,097评论 0 8
  • 前言 随着服务器硬件迭代升级,配置也越来越高。为充分利用服务器资源,并发编程也变的越来越重要。在开始之前,需要了解...
    最近有点懒阅读 2,177评论 0 4
  • 十六字令 游龙缸 观!君住龙缸享盛年。龙腾否?洞内舞翩跹。 注:重庆龙缸景区有龙洞一景,与湖北利川腾龙洞有...
    姚争杰阅读 456评论 3 5

友情链接更多精彩内容