Go高质量编程和性能调优(1月17日) | 青训营笔记

99 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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关键字来将一个错误关联至错误链中 image.png
      • 错误判定
        • 判定一个错误是否为特定错误,使用errors.Is
        • 不同于使用==,使用该方法可以判定错误链上的所有错误是否含有特定的错误
        • 在错误链上获取特定的错误,使用errors.As
      • panic (用于真正异常的情况)
      • recover
        • 只能在被defer的函数中使用
        • 嵌套无法生效
        • 只在当前goroutine生效
        • defer的语句是先进后出

1.3 性能优化建议

  • 简介

    • 性能优化的前提是满足可靠性、简洁清晰等质量因素
    • 性能优化是综合评估,有时候时间效率和空间效率可能对立
    • 针对Go语言特性,介绍Go相关的性能优化建议
  • 性能优化建议-Benchmark

    • 性能表现需要实际数据衡量
    • Go语言提供了支持基准性能测试的benchmark工具
    go test -bench=. -benchmem
    

    image.png

  • 性能优化建议-Slice (slice预分配内存)

    • 尽可能在使用make()初始化切片时提供容量信息

      image.png

    • 大内存未释放陷阱

      image.png

  • 性能优化建议-Map (map预分配内存)

    image.png

  • 性能优化建议-字符串处理

    • 使用strings.Builder
  • 性能优化建议-空结构体

    • 空结构体struct{} 实例不占据任何的内存空间
    • 可作为各种场景下的占位符使用
      • 节省资源
      • 空结构体本身具备很强的语义,仅作占位符
  • 性能优化建议-atomic包

    image.png

    • 锁的实现是通过操作系统,属于系统调用
    • atmoic操作是通过硬件实现,效率比锁高
    • sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量
    • 对于非数值操作,可以使用atmoic.Value,能承载一个interface{}
2. 性能调优实战

2.1 简介

  • 要依靠数据不是猜测
  • 要定位最大瓶颈而不是细枝末节
  • 不要过早优化
  • 不要过度优化

2.2 性能分析工具pprof

  • pprof简介

image.png

  • pprof排查实战

    image.png

    • 浏览查看指标CPU

      image.png

  • pprof的采样过程和原理

    • CPU

      image.png

    • Heap

      image.png

    • 协程和线程

      image.png

    • Block-阻塞 & Mutex-锁

      image.png

三、实践练习例子:

性能调优案例

四、课后个人总结:

经过本次课程学习,我学到了高质量编程和性能调优的相关知识。在学习高质量编程的过程中,我学习Go语言实际开发的编码规范,同时也通过各种案例了解了性能优化建议,之后我重点学习了pprof性能分析工具,可以帮助我们在以后的开发中变的更加高效,是自己的代码更加健壮!

五、引用参考:

  • 参考字节跳动青训营基础班学习资料PPT

bytedance.feishu.cn/file/boxcn7…

  • 参考Github资料

blog.wolfogre.com/posts/go-pp…