Go编码性能优化入门
测试工具:Benchmarkgo提供的基准性能测试的攻击
结果:
- 第一个参数表示GOMAXPROCS的值
- 第二个参数表示执行次数
- 第三个参数表示执行花费的时间
- 第四个参数表示每次执行申请多大的内存
- 第五个参数表示每次执行会向系统申请几次内存
编码性能优化
slice
- 预分配内存:尽可能的在使用make()初始化切片是提供容量信息(切片底层是一个数组,切片的操作并不是复制切片指向的元素二手创建一个新的切片)
- 大内存未释放:在已有切片的基础上创建切片,不会创建新的底层切片。底层数组在内存中有引用,会使得数组得不到释放,可以使用copy方法代替re-slice
map
- 预分配内存:不断向map中添加元素的操作会触发map的扩容,提前分配好空间可以减少内存拷贝和Rehash的情况。在已知情况下可以提前预估好需要分配的内存空间
string
- strings.Build:使用+拼接性能差,strings.Build,byte.Buffer相近。字符串在Go语言中是不可变类型,占用内存大小是固定的,使用+每次都会重新分配内存。strings.Build底层采用的是[]byte,不需要美测拼接重新分配内存。
struct
- 空结构体struct{}实例不会占用任何内存空间 作为各种条件场景下的占位符使用。空结构体本身具备很强的语义,即这里不需要任何值,仅作为占位符。实现Set可以考虑用map代理
atomic
- 锁是系统通过操作系统实现的,属于系统调用,atomic是通过硬件实现的,效率比锁高,,Mutex应该ongoing来保护一端逻辑,不仅仅用于保护一个变量。对于非数变量可以使用atomic.Value,能承载一个interface{}