这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
一、本堂课重点内容:
1. 高质量编程
2. 性能调优实战
二、详细知识点介绍:
1. 高质量编程
-
简介
- 什么是高质量 —— 编写的代码能够达到正确可靠、简洁清晰的目标可称之为高质量代码
-
简单性
- 消除“多余的复杂性”,以简单清晰的逻辑编写代码
- 不理解的代码无法修复改进
-
可读性
- 代码是写给人看的,而不是机器
- 编写可维护代码的第一步是确保代码可读
-
生产力
- 团队整体工作效率非常重要
1.2 编码规范
-
代码格式
-
注释
- 注释解释代码作用、如何做、实现原因、什么情况会出错
- 公共符合始终要注释(实现接口不需要)
-
命名规范
- 简洁
- 缩略词全大写,但当其位置变量开头且不需要导出时,使用全小写
- 变量如果使用的很少,则需要携带更多的上下文信息
- package
- 只由小写字母组成、不包含大写字母和下划线等字符
- 简短并包含一定的上下文信息。
- 不要与标准库同名。(例如不要使用:sync 或 strings)
- 不使用常用变量名作为包名。
- 使用单数而不是复数。(英文使用单数,encoding)
- 谨慎地使用缩写。
Good naming is like a good joke. If you have to explain it, it's not funny —— Dave Cheney
好的命名就像一个好笑话。如果你必须解释它,那就不好笑了
- 控制流程
- 避免嵌套,保持正常流程清晰
- 尽量保持正常代码路径为最小缩进
- 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
- 错误和异常处理
- 简单错误(优先使用errors.New来创建匿名变量来直接表示简单错误)
- 错误的Wrap和Unwrap
- 错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链
- 在fmt.Errorf中使用:%w关键字来将一个错误关联至错误链中
- 错误判定
- 判定一个错误是否为特定错误,使用errors.Is
- 不同于使用==,使用该方法可以判定错误链上的所有错误是否含有特定的错误
- 在错误链上获取特定的错误,使用errors.As
- panic (用于真正异常的情况)
- recover
- 只能在被defer的函数中使用
- 嵌套无法生效
- 只在当前goroutine生效
- defer的语句是先进后出
1.3 性能优化建议
-
简介
- 性能优化的前提是满足可靠性、简洁清晰等质量因素
- 性能优化是综合评估,有时候时间效率和空间效率可能对立
- 针对Go语言特性,介绍Go相关的性能优化建议
-
性能优化建议-Benchmark
- 性能表现需要实际数据衡量
- Go语言提供了支持基准性能测试的benchmark工具
go test -bench=. -benchmem -
性能优化建议-Slice (slice预分配内存)
-
尽可能在使用make()初始化切片时提供容量信息
-
大内存未释放陷阱
-
-
性能优化建议-Map (map预分配内存)
-
性能优化建议-字符串处理
- 使用strings.Builder
-
性能优化建议-空结构体
- 空结构体struct{} 实例不占据任何的内存空间
- 可作为各种场景下的占位符使用
- 节省资源
- 空结构体本身具备很强的语义,仅作占位符
-
性能优化建议-atomic包
- 锁的实现是通过操作系统,属于系统调用
- atmoic操作是通过硬件实现,效率比锁高
- sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量
- 对于非数值操作,可以使用atmoic.Value,能承载一个interface{}
2. 性能调优实战
2.1 简介
- 要依靠数据不是猜测
- 要定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
2.2 性能分析工具pprof
- pprof简介
-
pprof排查实战
- 搭建pprof实践项目
- 浏览器查看指标(http://localhost:6060/debug/pprof/)
-
浏览查看指标CPU
-
我
-
pprof的采样过程和原理
-
CPU
-
Heap
-
协程和线程
-
Block-阻塞 & Mutex-锁
-
三、实践练习例子:
性能调优案例
四、课后个人总结:
经过本次课程学习,我学到了高质量编程和性能调优的相关知识。在学习高质量编程的过程中,我学习Go语言实际开发的编码规范,同时也通过各种案例了解了性能优化建议,之后我重点学习了pprof性能分析工具,可以帮助我们在以后的开发中变的更加高效,是自己的代码更加健壮!
五、引用参考:
- 参考字节跳动青训营基础班学习资料PPT
bytedance.feishu.cn/file/boxcn7…
- 参考Github资料