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

47 | 性能分析工具

Go语言从入门到实战 笔记17 性能调优_第1张图片

Go语言从入门到实战 笔记17 性能调优_第2张图片

Go语言从入门到实战 笔记17 性能调优_第3张图片

Go语言从入门到实战 笔记17 性能调优_第4张图片

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

Go语言从入门到实战 笔记17 性能调优_第5张图片

Go语言从入门到实战 笔记17 性能调优_第6张图片

 

Go语言从入门到实战 笔记17 性能调优_第7张图片

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

Go语言从入门到实战 笔记17 性能调优_第8张图片

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

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

Go语言从入门到实战 笔记17 性能调优_第9张图片

Go语言从入门到实战 笔记17 性能调优_第10张图片

再查看memory的使用情况

Go语言从入门到实战 笔记17 性能调优_第11张图片

Go语言从入门到实战 笔记17 性能调优_第12张图片

48 | 性能调优示例

Go语言从入门到实战 笔记17 性能调优_第13张图片

Go语言从入门到实战 笔记17 性能调优_第14张图片

Wall time : 程序执行时间

Cpu time :    cpu执行时间

Block time : 程序阻塞时间

Go语言从入门到实战 笔记17 性能调优_第15张图片

把请求序列化

Go语言从入门到实战 笔记17 性能调优_第16张图片

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

Go语言从入门到实战 笔记17 性能调优_第17张图片

Go语言从入门到实战 笔记17 性能调优_第18张图片

Go语言从入门到实战 笔记17 性能调优_第19张图片

Go语言从入门到实战 笔记17 性能调优_第20张图片

Go语言从入门到实战 笔记17 性能调优_第21张图片

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

Go语言从入门到实战 笔记17 性能调优_第22张图片

Go语言从入门到实战 笔记17 性能调优_第23张图片

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

耗时从630ms 下降到180ms

 

Go语言从入门到实战 笔记17 性能调优_第24张图片

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

Go语言从入门到实战 笔记17 性能调优_第25张图片

 

49 | 别被性能锁住

Go语言从入门到实战 笔记17 性能调优_第26张图片

Go语言从入门到实战 笔记17 性能调优_第27张图片

开了40个协程去读取内容

Go语言从入门到实战 笔记17 性能调优_第28张图片

使用lock的读锁控制并发

Go语言从入门到实战 笔记17 性能调优_第29张图片

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

Go语言从入门到实战 笔记17 性能调优_第30张图片

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

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

Go语言从入门到实战 笔记17 性能调优_第31张图片

使用了分段锁

Go语言从入门到实战 笔记17 性能调优_第32张图片

Go语言从入门到实战 笔记17 性能调优_第33张图片

50 | GC 友好的代码

Go语言从入门到实战 笔记17 性能调优_第34张图片

Go语言从入门到实战 笔记17 性能调优_第35张图片

Go语言从入门到实战 笔记17 性能调优_第36张图片

传引用性能好很多

Go语言从入门到实战 笔记17 性能调优_第37张图片

Go语言从入门到实战 笔记17 性能调优_第38张图片

Go语言从入门到实战 笔记17 性能调优_第39张图片

以上就是输出的trace信息

Go语言从入门到实战 笔记17 性能调优_第40张图片

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

你可能感兴趣的:(go语言)