这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
高质量编程
高质量的编程需要注意以下原则:简单性、可读性、生产力
总结
- 命名的大多数规范核心在于考虑上下文
- 好的命名能让人把关注点留在主流程上,清晰地理解程序的功能,避免频繁切换到分支细节,增加理解成本
注解的使用
- 注释应该解释代码作用
- 注释应该解释代码如何做的
- 注释应该解释代码实现的原因
- 不要有过多不必要的注释
控制流程
- 避免嵌套,保持正常流程清晰
- 如果两个分支中都包含 return 语句,则可以去除冗余的 else
- 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
- 提高代码的可读性
性能优化
- 避免常见的性能陷阱可以保证大部分程序的性能
- slice 预分配内存 - 避免内存发生拷贝
- map 预分配内存 - 减少内存拷贝和 Rehash 的消耗
- 使用 strings.Builder
- 使用空结构体节省内存 - 空结构体不占据内存空间,可作为占位符使用
- 使用 atomic 包 - 效率比锁高很多
- 针对普通应用代码,不要一味地追求程序的性能,应当在满足正确可靠、简洁清晰等质量要求的前提下提高程序性能
什么是 pprof
pprof是一个Go语言程序的性能剖析工具,它可以生成程序的CPU、内存和goroutine等多种剖析报告,帮助开发者快速定位程序中的性能瓶颈和内存泄漏等问题。
pprof 实践
在代码中添加开始和停止采集的函数,用于开始和停止CPU Profile的采样
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal(err)
}
defer pprof.StopCPUProfile()
// TODO: 运行需要分析的代码
使用go tool pprof分析Profile
$ go tool pprof cpu.prof
pprof 的采样过程和原理
- CPU 采样
- 堆内存采样
- 协程和系统线程采样
- 阻塞操作和锁竞争采样