Go语言性能优化(2) | 青训营笔记

60 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天,今天主要学习了Go语言的性能优化。 高质量的代码能够完成功能,但是在大规模程序部署的场景,仅仅支持正常功能还不够,我们还要尽可能的提升性能,节省资源成本。

1.Benchmark

GO语言提供了支持基准性能测试的benchmark工具:可以知道函数执行次数,每次执行所用时间,每次执行申请的内存,以及申请内存次数等信息。

image.png

2.Slice优化tips

2.1创建切片

尽可能使用make初始化切片时提供容量信息,如下图2所示: image.png image.png image.png 原因是切片本质是一个数组片段(包含数组指针,片段长度和容量)

2.2切片的复制

如果要引用原来切片的部分内容,可用copy代替re-slice。

因为原切片较大,代码会在原切片基础上创建小切片(不会创建新的底层数组)导致原数组得不到释放

image.png

3.map优化tips

map可以预先指定size

4.字符串处理tips

使用strings.Builder

image.png

image.png 使用+的拼接性能最差。 字符串在GO语言是不可变类型,占用内存大小是固定的,使用+每次都会重新分配内存。

Strings.Builder,bytes.Buffer底层都是[]byte数组,不需要每次拼接重新分配内存。

5.空结构体

空结构体struct{}是不占用任何内存空间的占位符。

实现Set,可以考虑用map代替:此场景只需要用到map的键,不需要值。值可定义为空结构体struct{}。