性能优化及性能优化分析工具| 豆包MarsCode AI刷题

107 阅读2分钟

性能优化

slice预分配内存

type slice struct{}
    array unsafe.pointer
    len int
    cap int

copy替代re.silence,防止大内存未释放,因为如果复制后内存不会重新分配,如果是小切片判断大切片,就会造成内存浪费。

map预分配内存,防止触发无限增大。

字符串处理 尽量不用+ 而是改用strings.builder或者bytes.buffer 最好用string.builder。

因为+拼接性能最差,strings.builder,bytes.buffer性能差不多,但strings.builder快一点,因为+会重新分配内存,bytes.buffer会重新申请一块空间。而strings.builder是直接转换为字符串返回。

可以用空结构体节省内存,

map[int]struct[]->可以实现set方法

|

map[int] bool

atomic包比锁高

sync.mutex保护一段逻辑

性能优化分析工具 1.依靠数据 2.处理关键项目瓶颈 3.不要过早过度优化

pprof;可视化和分析性能分析数据

import
"log"
"net/http"
"net/http/pprof"

topN 查看占用资源最多的函数

flat->表示某个函数或代码段自身直接消耗的时间或资源量(不包含其子函数或调用链上的其他函数所消耗的时间或资源)。这个值反映了函数或代码段本身的性能瓶颈或开销。

flat% flat占cpu总时间的比例

sum% 上面每一行的flat%的总和

cum 指当前函数本身加上其调用函数的总耗时

cum% cum占cpu总时间的比值。

其中Flat==cum 没有调用其他函数

Flat==0 只有其他函数的调用

web->调用关系可视化

都是修改后缀

heap-堆内存

go tool pprof-http=:8080"http://loclalhost:6060/debug/pprof/heap"

view多种头展示,分析问题。

top视图
source视图,类似list命令结果

sample

allo-objects:程序累计申请的对象数

alloc_space:程序累计申请的内存大小

inuse_objects:程序当前持有的对象数

inuse_space:程序当前占用的内存大小

goroutine_协程

火焰图

1.从上到下表示调用顺序

2.每一块代表一个函数。越长代表占用CPU的时间更长

3.火焰图是动态的,支持点击块进行分析(简单交互)

支持搜素,在source视图下搜素wolf

mutex,锁

block-阻塞

两个block为什么只显示一个?

点开block将会得到两个,因为非存在性的点会被过滤掉

快速的响应时间能够显著提升用户体验。用户通常对延迟非常敏感,尤其是在移动设备和实时应用中。性能优化可以缩短页面加载时间、减少响应时间,从而提供更流畅的用户体验。所以性能优化是十分重要的