Go1.14即將于2020年2月底發(fā)布鳞上,這個(gè)版本有一些值得注意的性能改進(jìn),如下:
- defer
跟正常的函數(shù)調(diào)用相比,defer幾乎已經(jīng)沒有額外的開銷了。你可以在對(duì)性能極度敏感的代碼中放心的使用defer
了穷娱。
- 調(diào)度器
Goroutine支持真正意義上的搶占式調(diào)度了。我們知道在老版本中运沦,goroutine只有當(dāng)遇到I/O操作泵额、管道/同步操作或者用戶主動(dòng)調(diào)用了runtime.Gosched()
時(shí)才會(huì)讓出執(zhí)行權(quán),而為了避免一個(gè)goroutine長(zhǎng)期運(yùn)行"餓死"其他goroutine, Go編譯器還會(huì)在調(diào)用另一個(gè)函數(shù)之前埋點(diǎn)携添,即檢測(cè)一下當(dāng)前goroutine是否已經(jīng)長(zhǎng)時(shí)間執(zhí)行以決定是否切換到其他goroutine執(zhí)行嫁盲。這并不是真正意義上的搶占,只是一種模擬烈掠,它有個(gè)明顯的缺點(diǎn)羞秤,就是無法處理長(zhǎng)時(shí)間執(zhí)行且沒有調(diào)用其他函數(shù)的循環(huán)體缸托。在Go1.14版本中,除了windows-arm, darwin-arm, js-wasm, plan9平臺(tái)外都將支持搶占式協(xié)程調(diào)度瘾蛋。
- 頁(yè)分配器(Page Allocator)
Page Allocator在GOMAXPROCS
很大的情況下的鎖競(jìng)爭(zhēng)更少了俐镐。這樣帶來的好處是,并行分配內(nèi)存時(shí)速度更快哺哼、延遲更低佩抹。
- 內(nèi)置Timer
標(biāo)準(zhǔn)庫(kù)內(nèi)置的定時(shí)器現(xiàn)在更加高效了---- 減少了鎖競(jìng)爭(zhēng)和上下文切換次數(shù)。
個(gè)人感覺意義最大的當(dāng)屬搶占式調(diào)度的引入取董。之前有人在CPU密集型的任務(wù)中經(jīng)常會(huì)遇到其他協(xié)程長(zhǎng)時(shí)間得不到調(diào)度的情況棍苹,當(dāng)然對(duì)于CPU密集任務(wù)來說確實(shí)不應(yīng)該搞太多協(xié)程,沒啥意義茵汰,但是如果是用線程來實(shí)現(xiàn)的話這個(gè)問題是不存在的廊勃。相信1.14版本的發(fā)布可以讓很多人緩解對(duì)協(xié)程調(diào)度不夠“聰明”的擔(dān)憂。