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

63 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
对课程中学到的重要知识点做了笔记,方便后续的回顾

1. 高质量编程

  1. 高质量编程简介
  2. 性能调优简介
  3. 编码规范

2. 性能调优实战

2.1 性能调优简介

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

2.1.1 如何进行性能优化:

  1. 性能表现需要实际数据衡量
  2. Go语言提供了支持基准性能测试的benchmark工具 go test -bench=. -benchmem GOMAXPROCS——1.5版本后,默认值为CPU核数

2.1.2 每个字段的含义

测试函数名 一共执行次数 每次执行花费 每次执行申请几次内存 每次执行申请多大的内存

2.1.3 性能优化建议

  1. slice预分配内存&map预分配内存
  • 操作:尽可能在使用make()初始化切片时提供容量信息
  • 原因:
    • 切片本质是一个数组片段的描述
    • 包括数组指针
    • 片段的长度
    • 片段的容量(不改变内存分配情况下的最大长度)
  • 切片操作并不复制切片指向的元素
  • 创建—个新的切片会复用原来切片的底层数组
  1. 大内存未释放
  • 现象:在以后的切片上创建切片,原来的切片较大,会导致底层数组得不到释放
  • 解决方法:使用copy代替直接使用切片
  1. 使用strings.Builder

常见的字符串拼接方式:

s += str // 最低
var builder strings.Builder
builder.WriteString(str)  // 中间
buf := new(bytes.Buffer)   
buf.WriteString(str) // 最高

原因:

  1. 使用+每次都会重新分配内存

  2. strings.Builder ,bytes.Buffer底层都是[]byte数组自带内存扩容策略,不需要每次拼接重新分配内存

  3. 使用空结构体节省内存 空结构体 struct{} 实例不占据任何的内存空间

  4. 如何使用atomic包 atomic操作是通过硬件实现,效率比锁高 sync.Mutex应该用来保护─段逻辑,不仅仅用于保护—个变量

2.2 性能分析工具pprof实战

2.2.1 性能调优原则

  1. 要依靠数据不是猜测
  2. 要定位最大瓶颈而不是细枝未节
  3. 不要过早优化
  4. 不要过度优化

2.2.2 性能分析工具 pprof

简介:

希望知道应用在什么地方耗费了多少CPU、内存 pprof是用于可视化和分析性能分析数据的工具

开始使用:

  1. 浏览器中打开 http://localhost:6060/debug/pprof,

  2. 启动 go tool pprof "http://localhost:6060/debug/pprof/profile ? seconds=10" # 进入pprof调试

  3. top 查看CPU占用情况 Flat == Cum,函数中没有调用其他函数 Flat == 0,函数中只有其他函数的调用

  4. list 根据指定的正则表达式查找代码行

  5. web 调用关系可视化

  6. heap 堆内存 go tool pprof -http=:8080 "http://localhost:6060/dcbug/pprof/heap"

alloc_objects:程序累计申请的对象数 inuse_objects:程序当前持有的对象数 alloc space:程序累计申请的内存大小 inuse space:程序当前占用的内存大小

2.3 性能调优案例

课后个人总结

  1. 先是学习了go基础的编码规范是什么
  2. 了解了下go常用的性能调优方法,学习了pprof工具来对程序进行分析

参考资料

[go pprof实战]github.com/wolfogre/go… [golang pprof 实战]blog.wolfogre.com/posts/go-pp…