go语言性能优化建议|青训营笔记

47 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

1. 性能优化建议-Benchmark

利用go语言工具benchmark

go test 参数 [测试用例(文件)]//会将'*_test.go'文件编译运行,输出性能数据

注意:

  1. 每个程序都有入口,而go测试用的测试入口为func TestXxx(t *testing.T),一个单元测试文件可以有多个测试入口(Test后的第一个字符大写)
  2. 如果指定了测试用例可能会发生无法调用同包的包级变量,不指定会自动测试源码包下所有测试用例
  3. 测试用例文件不会参与正常源码编译,不会包含到可执行文件中
  4. 参数
  • -bench regexp 执行相应的 benchmarks,例如 -bench=.
  • -cover 开启测试覆盖率
  • -run regexp 只运行 regexp 匹配的函数,例如 -run=TestA 那么就执行包含有 Array 开头的函数;
  • -v 显示测试的详细命令。

2. slice优化

  1. slice实际可以看成底层数组地址和长度、容量的结构体,当使用了超过容量的数据则会扩容,此时会发生copy的行为

如:s[:cap(s)+1] 使用了超过容量的数据会自动扩容此时会发生copy

可以预分配空间来减少时间损耗
  1. 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不占内存