打脸了兄弟们,Go1.20 arena 来了!
大家好,我是煎魚。
大概半年前,我寫過一篇文章《Go 要違背初心嗎?新提案:手動管理內存》。有興趣了深入解的同學,可以再回顧一下。
當時我們還想著 Go 團隊應該不會接納,至少不會那么快:
沒想到,計劃趕不上變化。
懶得翻也可以看我再次道來,本文提到的提案《proposal: arena: new package providing memory arenas[1]》,這其中的 Arena 將會是一個突破項。
快速背景
Arena 指的是一種從一個連續的內存區域分配一組內存對象的方式。優點比一般的內存分配更有效率,也可以一次性釋放。當然了,它的重點是要手動管理內存。
Go 團隊希望加進 Go 特性中,示例代碼如下:
import?(“arena”… )type?T?struct?{val?int }func?main()?{a?:=?arena.New()var?ptrT?*Ta.New(&ptrT)ptrT.val?=?1var?sliceT?[]Ta.NewSlice(&sliceT,?100)sliceT[99].val?=?4a.Free() }手動調用 arena.New 方法分配 arena 內存,再調用 Free 方法進行釋放。
簡單來講就是可以手動管理內存,就可以做很多事了,因為可以亂來,所以也 “容易” 崩。
最新進展
這個提案一直在 issues 上適度的爭議討論,@Michael Knyszek 大佬代碼寫的很快,已經直接提交上去了...直到最近被人發現,讓他更新進度。
已經明確:Go1.20 將會支持 arena 特性,通過 GOEXPERIMENT=arena 來打開,接受大家的 review 和使用,社區當前抗阻較小。
已實現 API 和原提案不同的地方有:
API 使用了泛型,例如:arena.New[int](myArena "int")。
Arena 的 塊大小是 8 MiB 而不是 64 MiB,似乎在更多情況下提供了更好的性能。
MSAN 和 ASAN 模式可用于識別不會導致崩潰的 use-after-free 錯誤(內存損壞應該仍然是不可能的)。需注意,這些模式對非 cgo 的 Go 程序幾乎沒有作用。Arena 是個例外。
另外根據社區的反饋,可能還會出現配套類型的 Arena。如下函數簽名:
//?MakeMap?creates?a?new?map[K]V?with?the?provided?capacity. //?The?map[K]V?must?not?be?used?after?the?arena?is?freed. //?Accessing?the?underlying?storage?of?the?map?after?free?may?result?in?a?fault, //?but?this?fault?is?also?not?guaranteed. func?MakeMap[K?comparable,?V?any](a?*Arena,?cap?int?"K?comparable,?V?any")?map[K]V?{?...?}在 Go1.20 發布該新特性的話,按照發布周期計劃,是 2 月份左右發布,相信大家很快就能用上,可以多多關注。
總結
一開始了解這個提案時,還想著 Go 搞了快 10 年才采納和推進泛型。這 Arena 應該不至于這么快吧?畢竟加進去了,許多程序都可以寫的復雜起來。
沒想到...現實打臉來的太快,推進的很快。
就像其他小伙伴說的,這可以直接從代碼側優化性能,而不需要砍需求。也是一個有意思且不錯的源動力!
據小道消息,某些同學表示在框架和其它場景測過,有說變得快了,有說沒差多少。比較迷,提案內暫時未提供測試報告,不好定論。
Go 1.20 Beta 將在未來幾周內(2022.11 月底前)發布,讓我們拭目以待:)
推薦閱讀
Go 只會 if err != nil?這是不對的,分享這些優雅的處理姿勢給你!
Go 錯誤處理新思路?用左側函數和表達式
先睹為快,Go2 Error 的掙扎之路
參考資料
[1]
proposal: arena: new package providing memory arenas: https://github.com/golang/go/issues/51317
關注和加煎魚微信,
獲取一手業內消息和知識,拉你進交流群👇
你好,我是煎魚,出版過 Go 暢銷書《Go 語言編程之旅》,再到獲得 GOP(Go 領域最有觀點專家)榮譽,點擊藍字查看我的出書之路。
日常分享高質量文章,輸出 Go 面試、工作經驗、架構設計,加微信拉讀者交流群,和大家交流!
總結
以上是生活随笔為你收集整理的打脸了兄弟们,Go1.20 arena 来了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自费送最新款小米 Redmi Note
- 下一篇: Barcode Generator注册码