天天看點

golang1.20引入新特性arena,支援手動配置設定和釋放記憶體,初步測試性能提升5%-15%甚至更多,真的是起飛了!盡

作者:從頭開始自學java

golang 1.20引入新特性arena,支援 手動配置設定和釋放記憶體,初步測試性能提升5%-15%甚至更多,真的是起飛了!盡管目前還是實驗特性,對于泛型和反射reflect都已支援相當完善,常用場景比如JSON解析/ProtoBuf反序列化都會産生不少提升!

arena一個記憶體池的技術——建立一個大的連續記憶體塊,該記憶體塊隻需要預先配置設定一次,然後在此記憶體上建立對象,使用完後統一釋放記憶體。

使用arena隻需要配置設定一次記憶體,所有對象都在池中管理,手動選擇合适的時機釋放。

開啟arena

目前還是實驗特性,可如下任意開啟

定義環境變量: export GOEXPERIMENT=arenas

運作程式同時開啟: GOEXPERIMENT=arenas go run main.go

指定Build Tag: go run main.go -tags goexperiment.arenas

編寫相關代碼,可在需要開啟arena特性檔案增加 //go:build goexperiment.arenas。

使用步驟

1.建立arena記憶體池,不需要時釋放

NewArena(): 建立一個Arena, 可以建立多個Arena, 批量建立一批對象,統一手工釋放。它不是線程安全的。

Free(): 釋放Arena以及它上面建立出來的所有對象。

2.從池中配置設定需要的空間

目前隻支援具體對象和slice,還沒有實作MakeMap、MakeChan這樣在Arena上建立map和channel的方法,後續可能會加上。

NewT any *T: 建立一個對象

MakeSliceT any []T: 在Arena建立一個Slice。

3.如果希望記憶體池被釋放後還使用,可拷貝到堆配置設定空間上

CloneT any: 克隆一個Arena上對象,隻能是指針、slice或者字元串。如果傳入的對象不是在Arena配置設定的,直接原對象傳回,否則脫離Arena建立新的對象。

golang1.20引入新特性arena,支援手動配置設定和釋放記憶體,初步測試性能提升5%-15%甚至更多,真的是起飛了!盡
golang1.20引入新特性arena,支援手動配置設定和釋放記憶體,初步測試性能提升5%-15%甚至更多,真的是起飛了!盡
golang1.20引入新特性arena,支援手動配置設定和釋放記憶體,初步測試性能提升5%-15%甚至更多,真的是起飛了!盡

繼續閱讀