这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
对课程中学到的重要知识点做了笔记,方便后续的回顾
1. 高质量编程
- 高质量编程简介
- 性能调优简介
- 编码规范
2. 性能调优实战
2.1 性能调优简介
- 性能优化的前提是满足正确可靠、简洁清晰等质量因素
- 性能优化是综合评估,有时候时间效率和空间效率可能对立
2.1.1 如何进行性能优化:
- 性能表现需要实际数据衡量
- Go语言提供了支持基准性能测试的benchmark工具
go test -bench=. -benchmemGOMAXPROCS——1.5版本后,默认值为CPU核数
2.1.2 每个字段的含义
测试函数名 一共执行次数 每次执行花费 每次执行申请几次内存 每次执行申请多大的内存
2.1.3 性能优化建议
- slice预分配内存&map预分配内存
- 操作:尽可能在使用make()初始化切片时提供容量信息
- 原因:
- 切片本质是一个数组片段的描述
- 包括数组指针
- 片段的长度
- 片段的容量(不改变内存分配情况下的最大长度)
- 切片操作并不复制切片指向的元素
- 创建—个新的切片会复用原来切片的底层数组
- 大内存未释放
- 现象:在以后的切片上创建切片,原来的切片较大,会导致底层数组得不到释放
- 解决方法:使用copy代替直接使用切片
- 使用strings.Builder
常见的字符串拼接方式:
s += str // 最低
var builder strings.Builder
builder.WriteString(str) // 中间
buf := new(bytes.Buffer)
buf.WriteString(str) // 最高
原因:
-
使用+每次都会重新分配内存
-
strings.Builder ,bytes.Buffer底层都是[]byte数组自带内存扩容策略,不需要每次拼接重新分配内存
-
使用空结构体节省内存 空结构体 struct{} 实例不占据任何的内存空间
-
如何使用atomic包 atomic操作是通过硬件实现,效率比锁高 sync.Mutex应该用来保护─段逻辑,不仅仅用于保护—个变量
2.2 性能分析工具pprof实战
2.2.1 性能调优原则
- 要依靠数据不是猜测
- 要定位最大瓶颈而不是细枝未节
- 不要过早优化
- 不要过度优化
2.2.2 性能分析工具 pprof
简介:
希望知道应用在什么地方耗费了多少CPU、内存 pprof是用于可视化和分析性能分析数据的工具
开始使用:
-
启动 go tool pprof "http://localhost:6060/debug/pprof/profile ? seconds=10" # 进入pprof调试
-
top 查看CPU占用情况 Flat == Cum,函数中没有调用其他函数 Flat == 0,函数中只有其他函数的调用
-
list 根据指定的正则表达式查找代码行
-
web 调用关系可视化
-
heap 堆内存 go tool pprof -http=:8080 "http://localhost:6060/dcbug/pprof/heap"
alloc_objects:程序累计申请的对象数 inuse_objects:程序当前持有的对象数 alloc space:程序累计申请的内存大小 inuse space:程序当前占用的内存大小
2.3 性能调优案例
课后个人总结
- 先是学习了go基础的编码规范是什么
- 了解了下go常用的性能调优方法,学习了pprof工具来对程序进行分析
参考资料
[go pprof实战]github.com/wolfogre/go… [golang pprof 实战]blog.wolfogre.com/posts/go-pp…