这是我参与[第五届青训营]笔记创作活动的第3天。本文主要想对课堂上一些知识点进行记录总结。今天主要学习了性能调优。
一、本堂课重点内容
- 性能优化方面
- 性能优化工具
- 性能优化实战
二、详细知识点介绍:
1. 性能优化方面
性能优化需兼顾考虑时间和空间两方面因素,有时二者不可兼得。性能的表现需要用数据去进行说明 同时性能调优应遵循以下原则
- 依靠数据而不是猜想
- 定位最大瓶颈而不是细枝末节
- 不要过早过度优化
Benchmark go自带的基准测试函数
func Benchmark(f func(b *B)) BenchmarkResult {
b := &B{
common: common{
signal: make(chan bool),
w: discard{},
},
benchFunc: f,
benchTime: benchTime,
}
if b.run1() {
b.run()
}
return b.result
}
优化方向:
- slice预分配-避免额外分配
- copy代替re-slice-避免大内存未释放
- map预分配-减少内存拷贝和rehash销毁
- 拼接字符串时可使用strings.builder,性能上 +<strings.buffer<strings.builder
- 使用空结构体节省空间
- 适当使用atomic包
2. 性能优化工具
pprof工具
可用于获取应用在什么地方耗费了多少CPU、Memory,是一个用于可视化和分析性能分析数据的工具
- 采样 pprof支持对CPU、堆内存、携程、锁、阻塞、线程创建的采样
部分参数含义: CPU:
flat 当前函数本身执行耗时
flat% flat占CPU总时间比例
cum 函数本身加上其调用函数的总耗时
堆内存:
alloc_objects 程序累计申请的对象数
alloc_sqpce 程序累计申请的内存大小
inuse_space 程序当前占用的内存大小
- 展示 pprof支持top、调用图-Graph、火焰图-FlameGraph、Peek、源码-Source、反汇编-Disassemble
- 工具 pprof提供runtime/pprof和net/http/pprof工具
- 分析 pproof支持网页端和可视化终端的采样分析
性能优化实战
待补充