这是我参与「第五届青训营」伴学笔记创作活动的第3天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。
课程链接: juejin.cn/course/byte… juejin.cn/course/byte… juejin.cn/course/byte… juejin.cn/course/byte…
课程要点:
- 如何编写更简洁清晰的代码
- 常用go语言程序优化手段
- 熟悉go程序性能分析工具
- 了解工程中性能优化的原则和流程
高质量编程:
高质量:编写的代码能够达到正确可靠简洁清晰的目标
- 边界条件是否考虑完备
- 异常情况处理,稳定性
- 易读性
性能调优
- 性能优化的前提是满足正确可靠简洁清晰等质量因素
- 性能优化是综合评估,有时候时间效率和空间效率可能对立
go语言提供支持基准性能测试的benchmark工具
- 切片本质是一个数组片段的描述:
- 数组指针
- 片段长度
- 片段容量
- 切片操作并不复制切片指向的元素
- 创建一个新的切片会复用原来切片的底层数组
与slice相同,map也需要提前分配空间。
字符串拼接:使用stings.Builder最佳
- 避免常见的性能陷阱可以保证大部分程序的性能
- 普通应用代码,不要一味追求程序性能
- 越高级的性能优化手段越容易出现问题
- 在满足正确可靠简洁清晰的质量要求的前提下提高程序性能
性能优化实战
性能调优原则:
- 依靠数据
- 定位最大瓶颈
- 避免过早优化
- 避免过度优化
性能分析工具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 提供的函数,封装成接口对外提供网络访问。