Go性能优化|青训营笔记

51 阅读1分钟

Go性能优化|青训营笔记

这是我参与「第五届青训营」伴学笔记创作活动的第5天

1.benchmark

go内置性能测试工具

使用:

go test -bench=. -benchmem

结果:

image-20230116164819386

2.优化建议

2.1 slice

  • 尽可能使用make预分配

image-20230116164948315

原因:

image-20230116165115182

  • 巨型切片时,用copy代替re-slice

image-20230116165956598

2.2 map

  • 使用make预分配

image-20230116170126516

image-20230116170217357

2.3 字符串处理

  • 效率最高:strbuilder

拼接字符串三种方式:直接加,strbuilder,bytebuilder

image-20230116170419865

原因:

image-20230116170445666

  • 尽量也预分配

image-20230116170702393

2.4 运用空结构体

image-20230116170814392

2.5 atomic

使用atomic代替锁

image-20230116171025317

原因:

image-20230116171100063

3.pprof

3.1 简介

image-20230116173948170

3.2 实战

代码链接:github.com/wolfogre/go…

brew安装Graphviz,为后续在web看调试结果做准备

brew install graphviz

项目运行之后查看活动监视器,发现占用居多cpu

image-20230116174933197

用pprof查看并分析资源使用情况,每一步修改一个问题,代码流程还是很清晰的

go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
top #查看占用资源最多,主要看cpu问题
list [函数名] #查找函数
web #浏览器打开调用图
​
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap" #查看堆(内存)问题
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine" #查看协程问题,web页面切view可以看火焰图
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex" #查看锁问题
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block" #查看阻塞问题