这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
本篇笔记主要记录一下性能优化的学习知识
1.Benchmark
基准测试是测量一个程序在固定工作负载下的性能,Go语言也提供了可以支持基准性能测试的benchmark。
使用方法:
func Benchmark_test(b *testing.B) {
for i := 0; i < b.N ; i++ {
s := make([]int, 0)
for i := 0; i < 1000; i++ {
s = append(s, i)
}
}
}
这边对Slice不断进行append来进行demo测试。
需要注意的是:
- 测试文件需要以
*_test.go结尾 - 通过benchmark测试的方法必须以
Benchmark为前缀 - 通过benchmark测试的函数必须接受一个指向
Benchmark类型的指针作为唯一的参数,*testing.B,并且不能有返回值
2.几个直白的优化点
1.Slice
- 在初始化Slice的时候尽量提供容量信息以预分配内存,以便减少后续操作的扩容重新分配内存。
- 对原切片进行拷贝操作的时候使用copy函数,而不是直接对切片操作。
2.Map
- 和Slice一样,在初始化Map的时候尽量提供容量信息以预分配内存,以便减少后续操作的扩容重新分配内存和Rehash消耗。
3.String
- 在Go语言中,String是不可变类型,占用内存大小是固定的。
- 对字符串进行拼接尽量使用strings.Builder,可以优化性能,不需要每次拼接都重新分配内存。
4.空结构体
- 这个在之前的笔记中有提到过,空的结构体在Go语言中是不占内存的。
- 可以作为占位符运用,也可以实现set数据结构,和channel的通信占位符。
5.atomic
- 根据单词可以知道,这是原子化操作。可以联想到事务的原子性。
- atomic可以通过硬件操作进行加锁,从而效率大于直接进行代码上的加锁操作。
3.注意事项
人生苦短,不如go浪一下。