这是我参与「第三届青训营 -后端场」笔记创作活动的第 2 篇笔记
高质量编程与性能调试
1.如何编写更简洁的代码 2.常用的Go优化手段 3.熟悉的性能分析工具 4.了解性能优化的原则和流程
一.高质量编程 高质量编程简介 编码规范 性能优化建议
二性能调优实战 性能调优简介 性能分析工具PProf实战 性能调优案例
01高质量编程 1.1 简介 高质量编程是编写的代码能够达到正确可靠简介清晰的目标。 如 边界条件 异常处理 稳定性 易读易维护
原则 : 简单性;可读; 生产力:团队整体工作效率
1.2编码规范 代码格式: 使用 gofmt自动化格式 注释格式:解释代码作用;解释如何做的;解释实现原因;出错的情况
代码是最好的注释 注释应该提供代码为表达的上下文信息
命名规范 核心目标是降低阅读理解代码成本 重点是上下文信息,设计简单清晰的名称
控制流程 线性原理,处理逻辑代码尽量走直线,避免复杂嵌套分支 正常流程代码沿着屏幕向下移动 提升代码可维护性和可读性 故障问题大熊出现在复杂条件语句和循环中
错误和异常处理
1.3.1性能优化建议 Benchmark
1.3.2 预分配内存 尽量使用make() 初始化 data:=make([] int,0,size); map:=make(map[int]int,size);
1.3.3 字符串处理
拼接 strings.Builder
var builder strings.Builder//直接创建 builder
builder.Grow(size) //预分配内存
builder.WriteString(str) //拼接
return builder.String() //返回string
1.3.4 创建set map map:=make(map[int]int)//创建一个 map set:=make(map[int] struct{})//创建一个set
1.3.5 atomic 多线程 优化极高效率 原理 一般锁是通过操作系统来实现,属于系统调用,成本高 atomic操作是通过硬件实现,效率比系统调用高 sync.Mutex 应该用来保护一段逻辑
总结 避免常见的性能陷阱可以保证大部分程序的性能 针对普通应用代码,不要一味地追求程序的性能, 应当在满足正确可靠、简洁清晰等质量要求的前提下提高程序性能
2性能调优
2.1性能调优原则 要依靠数据不是猜测 要定位最大瓶颈而不是细枝末节 不要过早优化 不要过度优化
2.2性能分析工具pprof 有可视化界面 性能分析指的是 希望知道在什么地方应用了多少CPU和内存 性能调优的核心是性能瓶颈的分析,对于 Go 应用程序,最方便的就是 pprof 工具
在终端输入 看CPU耗时性能
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
top命令 看总的耗时
flat 当前函数本身执行的耗时 flat% 当前函数执行占CPU 时间比例 sum% 到当前共占CPU比例 cum 当前函数本身加上其调用函数耗时 cum% cum 占CPU 比例
flat ?=cum 没有调用其他函数 相等 flat==0 只调用其他函数,本函数没有逻辑代码
list Eat 函数名 看具体耗时情况位置 web 可视化结构树状图 web页面
看内存性能 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap" 操作VIEW 看具体 消耗
看协程性能 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
由上到下表示调用顺序 每一块代表一个函数 越长CPU 越长 火焰图动态的,支持点击快分析