前一篇是提高cpu效率的方式,性能需要时间和空间效率上平衡。
- 空结构体
1. 空结构体不占据任何的内存空间
2. 可作为各种场景下的占位符使用
3. 可以利用空结构体实现set,只需要用到map键,而不需要值
- Atomic包
1. 实现多线程编程的一个计数器
2. 保证技术准确、性能安全的方式
3. 使用atomic包
(1) 锁的实现是通过操作系统来实现,属于系统调用
(2) Atomic操作是通过硬件实现,效率比锁高
(3) syn.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量
(4) 对于非数值操作,可以使用actomic.Value,能承载一个interface{}
- 总结
1. 避免常见的性能缺陷可以保证大部分程序性能
2. 普通应用代码,不要一味地追求程序的性能
3. 越高级的性能优化手段越容易出现问题
4. 在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能
- 性能调优工具
- 性能调优原则
-
要依靠数据不是猜测
-
要定位最大瓶颈而不是细枝末节
-
不要过早优化
-
不要过度优化
- 性能分析工具pprof
使用pprof可以知道应用在什么地方耗费了多少cpu、memory,它是用于可视化和分析性能分析数据的工具,它可以提供工具、采样、分析和展示的功能。
-
排查实战
-
搭建pprof实践项目
代码目录:
- 浏览器查看指标
进程查看:
CPU:
命令:web
调用关系可视化 (导包未完成导致无法查看可视化,我再研究研究。。。)
- pprof采样过程和原理
- 采样对象:函数调用和它们占用的时间
- 采样率:100次/秒,固定值
- 采样时间:从手动启动到手动结束 过程: 开始采样->设定信号处理函数->开启定时器 停止采样->取消信号处理函数->关闭定时器 CPU: 操作系统:每10ms向进程发送一次SIGPROF信号 进程:每次接收到SIGPROF会记录调用堆栈 写缓冲:每100ms读取已经记录的调用栈并写入输出流
- Heap-堆内存
1. 采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量。
2. 采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录
3. 采样时间:从程序运行开始到采样时
4. 采样指标: alloc space, alloc_objects, inuse_space, inuse_objects
5. 计算方式: inuse = alloc - free