这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天,今天主要学习了Go语言的性能优化。 高质量的代码能够完成功能,但是在大规模程序部署的场景,仅仅支持正常功能还不够,我们还要尽可能的提升性能,节省资源成本。
1.Benchmark
GO语言提供了支持基准性能测试的benchmark工具:可以知道函数执行次数,每次执行所用时间,每次执行申请的内存,以及申请内存次数等信息。
2.Slice优化tips
2.1创建切片
尽可能使用make初始化切片时提供容量信息,如下图2所示:
原因是切片本质是一个数组片段(包含数组指针,片段长度和容量)
2.2切片的复制
如果要引用原来切片的部分内容,可用copy代替re-slice。
因为原切片较大,代码会在原切片基础上创建小切片(不会创建新的底层数组)导致原数组得不到释放
3.map优化tips
map可以预先指定size
4.字符串处理tips
使用strings.Builder
使用+的拼接性能最差。
字符串在GO语言是不可变类型,占用内存大小是固定的,使用+每次都会重新分配内存。
Strings.Builder,bytes.Buffer底层都是[]byte数组,不需要每次拼接重新分配内存。
5.空结构体
空结构体struct{}是不占用任何内存空间的占位符。
实现Set,可以考虑用map代替:此场景只需要用到map的键,不需要值。值可定义为空结构体struct{}。