这是我参与「第五届青训营」伴学笔记创作活动的第 12 天
高质量的代码能够完成功能,但是在大规模程序部署的场景,仅仅支持正常功能还不够,我们还要尽可能的提升性能,节省资源成本,接下就主要介绍性能相关的建议。
性能优化指南
高性能代码为了效率会用到许多技巧,没有相关背景的人难以理解,不过有些基础性能问题是和语言本身相关的,接下来主要介绍这类内容,对应的调整对可读性和可维护性影响不大 在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的性能。有时候时间效率和空间效率可能对立,此时应当分析哪个更重要,作出适当的折衷。例如多花费一些内存来提高性能。针对Go语言编程,介绍Go相关的性能优化建议。
性能优化建议-Benchmark
如何使用
- 性能表现需要实际数据衡量
- Go语言提供了支持基准性能测试的
benchmark工具 go test -bench=. -benchmem在介绍具体建议之前,我们首先看一下如何评估性能,性能表现要用数据说话,实际情况和想象中的并不一定一致,要用数据来验证我们写的代码是否真的有性能提升。Go自带了性能评估工具:以计算斐波那契数列的函数为例,分两个文件,fib.go编写函数代码,fib_test.go编写benchmark的逻辑,通过命令运行benchmark可以得到测试结果,-benchmem表示也统计内存信息。
结果说明
可以看到实际执行的结果,后续就通过这种benchmark结果来对比分析不同代码的性能表现。
性能优化建议-Slice
slice 预分配内存
- 尽可能在使用make()初始化切片时提供容量信息
- 切片本质是一个数组片段的描述
- 包括数组指针
- 片段的长度
- 片段的容量(不改变内存分配情况下的最大长度)
- 切片操作并不复制切片指向的元素
- 创建一个新的切片会复用原来切片的底层数组
- 在已有切片基础上创建切片,不会创建新的底层数组
- 场景
- 原切片较大,代码在原切片基础上新建小切片
- 原底层数组在内存中有引用,得不到释放
- 可使用cope替换re-slice