天天看点

golang1.20引入新特性arena,支持手动分配和释放内存,初步测试性能提升5%-15%甚至更多,真的是起飞了!尽

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%甚至更多,真的是起飞了!尽

继续阅读