性能调优
-
性能调优原则
- 依靠数据而不是猜测
- 定位最大瓶颈而不是细枝末节
- 不要过早优化(出现性能问题再优化)
- 不要过度优化
性能优化建议
-
Benchmark 工具
- 在命令行中使用 go test -bench=. -benchmen
- 在命令行中使用 go test -bench=. -benchmen
-
slice 预分配内存
-
尽可能使用make()在初始化切片和map等时提供容量信息
-
在切片复制时使用 copy 复制以防止大内存未释放
- 在已有基础上创建新切片,不会创建新的底层数组,当我们在一个大切片上创建小切片时大切片不会被释放
-
字符串的拼接时使用 strings.Buffer 更快
- 直接 “ + ” 时每次都会重新分配内存
- strings.Builder 和 bytes.Buffer 底层是 []byte 数组
- strings.Buffer底层是内存扩容策略( buf.Grow(n * len(str) )
-
空结构体
- 使用空结构体 struct{} 来节省内存
- 可以作为空占位符来使用,以节省资源
-
m := make(map[string]struct{}) //实现set
-
-
atomic 包用于多线程的性能优化
性能分析工具 pprof 实战
-
简介:用于可视化和分析性能分析数据的工具
-
作用:知道应用在什么地方耗费了多少CPU和内存
-
搭载 pprof 实践项目:
-
在浏览器打开
localhost:6060/debug/pprof
-
排查实战
Cpu
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"-
topN命令
-
Tips
- Flat == Cum : 函数中没有调用其他函数
- Flat == 0 : 函数中只有其他函数的调用
-
list命令
-
web命令:调用关系可视化
Heap:堆内存查看
go tool pprof -http=:8080"http://localhost:6060/debug/pprof/heap"- Top视图:类似于Cpu的topN
- Source视图
goroutine - 协程
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"- 由上到下表示调用顺序
- 每一块代表一个函数,越长代表占用CPU时间更长
- 火焰图是动态的,支持点击块进行分析
mutex - 锁
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"block - 阻塞
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"小结
-