后端基础day3-高质量编程|青训营笔记

72 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第3天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。

课程链接: juejin.cn/course/byte… juejin.cn/course/byte… juejin.cn/course/byte… juejin.cn/course/byte…

课程要点:

  • 如何编写更简洁清晰的代码
  • 常用go语言程序优化手段
  • 熟悉go程序性能分析工具
  • 了解工程中性能优化的原则和流程

高质量编程:

高质量:编写的代码能够达到正确可靠简洁清晰的目标

  • 边界条件是否考虑完备
  • 异常情况处理,稳定性
  • 易读性

image.png

image.png

image.png

image.png

image.png

性能调优

  • 性能优化的前提是满足正确可靠简洁清晰等质量因素
  • 性能优化是综合评估,有时候时间效率和空间效率可能对立

go语言提供支持基准性能测试的benchmark工具

image.png

  • 切片本质是一个数组片段的描述:
    • 数组指针
    • 片段长度
    • 片段容量
  • 切片操作并不复制切片指向的元素
  • 创建一个新的切片会复用原来切片的底层数组

image.png

与slice相同,map也需要提前分配空间。

字符串拼接:使用stings.Builder最佳

image.png

image.png

  • 避免常见的性能陷阱可以保证大部分程序的性能
  • 普通应用代码,不要一味追求程序性能
  • 越高级的性能优化手段越容易出现问题
  • 在满足正确可靠简洁清晰的质量要求的前提下提高程序性能

性能优化实战

性能调优原则:

  • 依靠数据
  • 定位最大瓶颈
  • 避免过早优化
  • 避免过度优化

性能分析工具pprof

pprof的用途

  • CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗CPU 周期时花费时间的位置
  • Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
  • Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置。阻塞分析对分析程序并发瓶颈非常有帮助。
  • Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况。

所以当内存或者cpu飙升的时候,我们可以使用go自带的性能分析利器pprof来查找问题所在。

Go 语言自带的 pprof 库就可以分析程序的运行情况,并且提供可视化的功能。它包含两个相关的库: runtime/pprof

对于只跑一次的程序,例如每天只跑一次的离线预处理程序,调用 pprof 包提供的函数,手动开启性能数据采集。 net/http/pprof

对于在线服务,对于一个 HTTP Server,访问 pprof 提供的 HTTP 接口,获得性能数据。当然,实际上这里底层也是调用的 runtime/pprof 提供的函数,封装成接口对外提供网络访问。

image.png

image.png

image.png

image.png