Go语言从入门到实战 笔记17 性能调优

47 | 性能分析工具

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

使用go语言自带的性能分析函数,创建cpu profile

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

 

Go语言从入门到实战 笔记17 性能调优

使用命令看下函数执行的性能指标

Go语言从入门到实战 笔记17 性能调优

list fillMatrix 做函数方法的性能深入分析

Go语言从入门到实战 笔记17 性能调优

使用 go-torch cpu.prof 生成火焰图

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

再查看memory的使用情况

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

48 | 性能调优示例

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

Wall time : 程序执行时间

Cpu time :    cpu执行时间

Block time : 程序阻塞时间

Go语言从入门到实战 笔记17 性能调优

把请求序列化

Go语言从入门到实战 笔记17 性能调优

请求反序列化成为字符串,拼接后返回结对象repObj; 再把结果对象序列化成为一个json

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

换一下json的反序列化函数,再次测试性能如下,耗时从670ms变成了480ms

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

字符串拼接耗时630ms,内存使用了1.55GB,改成用strings.Builder,如下

耗时从630ms 下降到180ms

 

Go语言从入门到实战 笔记17 性能调优

内存占用从1.55GB下降到132.05MB

Go语言从入门到实战 笔记17 性能调优

 

49 | 别被性能锁住

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

开了40个协程去读取内容

Go语言从入门到实战 笔记17 性能调优

使用lock的读锁控制并发

Go语言从入门到实战 笔记17 性能调优

可以发现,使用的读锁RLock,对cpu性能产生了很大的消耗,修改时会锁住整个map

Go语言从入门到实战 笔记17 性能调优

此种map是分成只读区域read 和 可写的区域Dirty, dirty里面查找是需要加锁的

如果从只读read区域读取,miss很多次,就会从dirty区域把数据同步到read,更新过程采用CompareAndSwap

Go语言从入门到实战 笔记17 性能调优

使用了分段锁

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

50 | GC 友好的代码

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

传引用性能好很多

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

Go语言从入门到实战 笔记17 性能调优

以上就是输出的trace信息

Go语言从入门到实战 笔记17 性能调优

切片初始化为合适的大小,减少自动扩容导致的性能损耗