「3」高质量代码 & 性能调优·pprof|青训营笔记

195 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 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

  1. 注释应该去解释代码什么时候会出错,合适的解释代码的限制条件。

  2. 公共符号需要注释

    1. 任何不明显也不简短的公共符号一定需要注释。
    2. 任何库中函数都需要注释。

关于变量命名

简洁胜于冗长

  • 缩写全大写

  • 变量距离被使用的地方越远,越要在命名上携带更多的信息

    • 比如 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