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