这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1. 性能优化建议-Benchmark
利用go语言工具benchmark
go test 参数 [测试用例(文件)]//会将'*_test.go'文件编译运行,输出性能数据
注意:
- 每个程序都有入口,而go测试用的测试入口为
func TestXxx(t *testing.T),一个单元测试文件可以有多个测试入口(Test后的第一个字符大写)- 如果指定了测试用例可能会发生无法调用同包的包级变量,不指定会自动测试源码包下所有测试用例
- 测试用例文件不会参与正常源码编译,不会包含到可执行文件中
- 参数
- -bench regexp 执行相应的 benchmarks,例如 -bench=.
- -cover 开启测试覆盖率
- -run regexp 只运行 regexp 匹配的函数,例如 -run=TestA 那么就执行包含有 Array 开头的函数;
- -v 显示测试的详细命令。
2. slice优化
- slice实际可以看成底层数组地址和长度、容量的结构体,当使用了超过容量的数据则会扩容,此时会发生copy的行为
如:
s[:cap(s)+1]使用了超过容量的数据会自动扩容此时会发生copy可以预分配空间来减少时间损耗
- slice底层引用的数组是可以复用的,即多个slice使用同一个数组,但是其使用的首地址不一定相同
如:
s1 := s2[:] //使用相同数组这种情况可能会发生多个小切片引用较大的数组,而当原来的切片回收时会产生空间浪费可以用copy(dist,src)新建底层数组来避免
3. 字符串
使用+、string.Builder、bytes.Buffer拼接字符串
- '+'最慢,因为string是不可变的,使用+每次会发生新建字符串,涉及内存分配
- string.Builder、bytes.Bufer:实现是byte[],可以预定义内存。但byte.Buffer转为字符串时还会申请一块空间故稍慢
4. 使用空结构体
空结构体不占空间,在一些场合可做占位符 如没用
map[type]struct{}作为set,value不占内存