评估性能
Benchmark
go test -bench=. -benchmem
性能优化建议
-
slice 预分配内存
尽可能在使用make()初始化切片时提供容量信息
-
场景
- 原切片较大,代码在原切片基础上新建小写篇
- 原底层数组在内存中引用,得不到释放
建议使用copy替代re-slice
-
map预分配内存
分析:
- 不断向map中添加元素的操作会触发map的扩容
- 提前分配好空间可以减少内存拷贝和rehash的消耗
- 建议根据实际需求提前预估好需要的空间
-
字符串处理使用strings.Builder
分析:
- go中的字符串类型是不可变类型,占用内存大小是固定的
- 使用
+
每次都会重新分配内存 - strings.Builder,bytes.Buffer底层都是[]byte数组
- 内存扩容策略,不需要每次拼接重新分配内存
-
使用空结构体节约内存
空结构体struct{}不占据任何的内存空间
空结构体本身具备很强的语义,即这里不需要任何值,仅作为占位符
模拟set
-
使用atomic包
锁的实现是通过操作系统来实现,属于系统调用
atomic操作是通过硬件实现,效率比锁高
sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量
对于非数值操作可使用atomic.Value,能承载一个interface{}