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版本的發佈可以讓很多人緩解對協程調度不夠“聰明”的擔憂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章