性能优化的建议 前提是满足正确可靠、简洁清晰等质量因素 性能优化是综合评估,有时候时间效率和空间效率可能对立 针对go语言特性,介绍go相关的性能优化建议
Benchmark go test -bench=. -benchmem 执行之后的表包含了,执行了多少次,每次执行的时间花费,每次执行申请的内存大小,每次执行申请多少次内存 在使用这个功能的前提需要注意,我们需要一个以_test.go结尾的go文件,如课程当中的fib_test.go文件,并且测试函数的函数名的第一个字母必须大写。
性能优化指南
Slice
slice预分配neicun
尽可能在使用make()初始化切片时提供容量信息
切片本质是一个包含数组指针的,片段长度,片段容量的结构体数组,如果未指定且容量不足时,需要进行额外的扩容操作
大内存未释放
在已有切片基础上创建切片,不会创建新的底层数组
Map
同样需要进行内存大小的初始化,提前分配好空间可以减少内存拷贝和Rehash的消耗
字符串处理
使用strings.Builder
尽量不要使用+来拼接字符串,因为字符串在go中是不可变类型,占用内存大小是固定的。每次使用+都会重新分配内存,strings.Builder,bytes.Buffer底层都是[]byte数组。内存扩容策略,不需要每次拼接重新分配内存
空结构体
空结构体struct{}实例不占据任何的内存空间,可作为各种场景下的占位符使用,可以节省资源,并且空结构体本身具备很强的语义,即这里不需要任何值,仅作为占位符
atomic包
使用atomic比用锁的效率更高,因为锁的实现是通过操作系统来实现,属于系统调用,atomic操作是通过硬件实现,sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量,对于非数值操作,可以使用atomic.Value,能承载一个interface{}