高质量编程与性能调优 | 青训营笔记

38 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

高质量编程

高质量的编程需要注意以下原则:简单性、可读性、生产力

总结

  • 命名的大多数规范核心在于考虑上下文
  • 好的命名能让人把关注点留在主流程上,清晰地理解程序的功能,避免频繁切换到分支细节,增加理解成本

注解的使用

  • 注释应该解释代码作用
  • 注释应该解释代码如何做的
  • 注释应该解释代码实现的原因
  • 不要有过多不必要的注释

控制流程

  • 避免嵌套,保持正常流程清晰
  • 如果两个分支中都包含 return 语句,则可以去除冗余的 else
  • 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
  • 提高代码的可读性

性能优化

  • 避免常见的性能陷阱可以保证大部分程序的性能
    • slice 预分配内存 - 避免内存发生拷贝
    • map 预分配内存 - 减少内存拷贝和 Rehash 的消耗
    • 使用 strings.Builder
    • 使用空结构体节省内存 - 空结构体不占据内存空间,可作为占位符使用
    • 使用 atomic 包 - 效率比锁高很多
  • 针对普通应用代码,不要一味地追求程序的性能,应当在满足正确可靠、简洁清晰等质量要求的前提下提高程序性能

什么是 pprof

pprof是一个Go语言程序的性能剖析工具,它可以生成程序的CPU、内存和goroutine等多种剖析报告,帮助开发者快速定位程序中的性能瓶颈和内存泄漏等问题。

image.png

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 采样
  • 堆内存采样
  • 协程和系统线程采样
  • 阻塞操作和锁竞争采样