go性能优化 | 青训营

65 阅读2分钟

1性能优化建议

1.2 性能优化-Benchmark

Go语言提供了支持基准性能测试的benchmark工具

1.3 性能优化建议-Silce,Map

提前分配 Slice 大小

尽可能在初始化的时候提供 Slice 的大小,这样可以达到近乎三倍的性能提升,如下:

func NoPreAlloc(size int){
    data := make([]int, 0)
    for k := 0; k < size; k ++ {
        data = append(data, k)
    }
}

以上一般是我们正常初始化数组的一个步骤,但是我们可以在初始化的时候提供容量信息,例如:

data := make([]int, 0, size)

这样可以通过 slice 预分配内存来优化性能

这个原因是因为切片本质是一个数组片段的描述,如果是我们不提供容量的话,go 默认分配的容量不一定能够 cover 我们所需要的大小,那么当我们需要放入超过容量的 item 时,会发生内存拷贝。

map 和 slice 一样,我们可以在 make 的时候增加 size 参数,来预分配内存。 不断向map中添加元素操作会触发map扩容

提前分配好空间可以减少内存拷贝和ReHash的消耗

1.4性能优化建议-字符串处理

使用+拼接性能最差,strings.Builder,bytes.Buffer相近,strings.Buffer更快
字符串在Go语言中是不可变类型,占用内存大小固定 使用 + 每次都会重新分配内存, 后面的底层都是 []byte数组,内存扩容策略,不需要每次拼接重新分配内存

1.5 性能优化建议-空结构体

使用空结构体节省内存

1.6 性能优化建议-atomic包

使用atomic包
锁的实现是通过操作系统来实现,属于系统调用
atomic操作是通过硬件实现,效率比锁高
sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量
对于非数值操作,可以使用atomic.Value,能承载一个interface{}