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建立新的對象。