这是我参与「第三届青训营 -后端场」笔记创作活动的的第 4 篇笔记。
创建时间: May 17, 2022 12:04 PM
标签: PPROF, 代码规范
定义如何定义高质量代码
Golang Wiki github.com/golang/go/w…
💡 编写的代码能够达到正确可靠、简洁清晰的目标称之为高质量代码
- 边界条件考虑完备
- 异常情况合适的处理,保证稳定性
- 易读易维护
关于注释
”好的代码有很多注释,坏的代码需要很多注释“ Good Code has lots of comments, bad code requires lots of comments. — Dave Thomas & Andrew Hunt
-
注释应该去解释代码什么时候会出错,合适的解释代码的限制条件。
-
公共符号需要注释
- 任何不明显也不简短的公共符号一定需要注释。
- 任何库中函数都需要注释。
关于变量命名
简洁胜于冗长
-
缩写全大写
-
变量距离被使用的地方越远,越要在命名上携带更多的信息
- 比如 time.Time 被命名为 t,和 deadline 携带有不同的信息量。
关于函数命名
函数名不携带包名已有的信息
Http 包
- Serve()
- ServeHTTP()
关于包命名
- 只含小写字幕,不含大写字母、下划线等
- 简短
- 不要与标准库同名
- 尽量使用单数
- 慎用缩写命名,除非缩写不破坏可读性
💡 强调编码规范的核心目标:降低代码的理解成本。
”好的命名就像一个好笑话。如果你必须解释它,那就不好笑了。“ Good naming is like a good joke. If you have to explain it, it's not funny. —Dave Cheney
性能优化
Benchmark
补充上节,对 Benchmark 输出各自段含义进一步解释。
-
BenchmarkXXX-N
- N 代表 GOMAXPROCS 数,Go1.5 后默认值为 CPU 核心数。
-
纯数字 X
- X 代表执行次数, 即 b.N 的值。
-
xxx ns/op
- 每次执行花费时间
-
xx B/op
- 每次执行申请多大的内存
-
xx allocs/op
- 每次执行申请几次内存
编码上性能优化
核心思路:内存预分配,在 Golang 中,只要不涉及内存扩容、错误用锁的场景是可以一定程度上保证执行效率的。
合理使用空结构体可以提升性能,比如实现 Set,就可以定义 map[key]struct{} 使用不占内存的空结构体作为 value,在实现需求的情况下不浪费内存空间。
复现 pprof 应用
因为课上网络波动 + 我的设备因为内存出现问题,我选择课后进行一次完整的复现,这节课内容干货是非常多的。
代码仓库克隆过程略过 参考博客
进入命令行交互的 pprof 工具
/debug/pprof/profile分析 CPU 占用/debug/pprof/heap分析堆内存分配/debug/pprof/allocs分析内存申请/debug/pprof/goroutine检查协程/debug/pprof/mutex检查锁
go tool pprof http://localhost:6060/debug/pprof/profile?second=10