性能调优启蒙 | 青训营笔记

60 阅读2分钟

性能调优

  • 性能调优原则

    • 依靠数据而不是猜测
    • 定位最大瓶颈而不是细枝末节
    • 不要过早优化(出现性能问题再优化)
    • 不要过度优化

性能优化建议

  • Benchmark 工具

    • 在命令行中使用 go test -bench=. -benchmen image.png
  • slice 预分配内存

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

    • 在切片复制时使用 copy 复制以防止大内存未释放

      • 在已有基础上创建新切片,不会创建新的底层数组,当我们在一个大切片上创建小切片时大切片不会被释放
    • 字符串的拼接时使用 strings.Buffer 更快

      • 直接 “ + ” 时每次都会重新分配内存
      • strings.Builder 和 bytes.Buffer 底层是 []byte 数组
      • strings.Buffer底层是内存扩容策略( buf.Grow(n * len(str) )
    • 空结构体

      • 使用空结构体 struct{} 来节省内存
      • 可以作为空占位符来使用,以节省资源
      • m := make(map[string]struct{}) //实现set
        
  • atomic 包用于多线程的性能优化

性能分析工具 pprof 实战

  • 简介:用于可视化和分析性能分析数据的工具

  • 作用:知道应用在什么地方耗费了多少CPU和内存

  • 搭载 pprof 实践项目:

  • 排查实战

    Cpu
    go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
    
    • topN命令 image.png

    • Tips

      • Flat == Cum : 函数中没有调用其他函数
      • Flat == 0 : 函数中只有其他函数的调用
    • list命令

      image.png

    • web命令:调用关系可视化

      image.png

    Heap:堆内存查看
    go tool pprof -http=:8080"http://localhost:6060/debug/pprof/heap"
    
    • Top视图:类似于Cpu的topN
    • Source视图 image.png
    goroutine - 协程
    go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
    
    • 由上到下表示调用顺序
    • 每一块代表一个函数,越长代表占用CPU时间更长
    • 火焰图是动态的,支持点击块进行分析
    mutex - 锁
    go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
    
    block - 阻塞
    go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"
    
    小结

    image.png