[ 后端基础Day3 | 青训营笔记]

41 阅读2分钟

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

一、内容:

1.性能优化Slice

在使用 slice 时,如果知道切片的容量与大小,可以进行赋值操作,slice预分配,指定大小。相比 append 减少返回新的切片,同样是给一个切片添加元素,赋值操作性能提升 35%

image-20230119220535595.png

2.性能优化Map

image-20230119221256157.png

预分配Map内存

3.性能优化字符串处理

image-20230119221349588.png

使用strings.Builder

4.性能优化空结构体

使用空结构体节省内存

实现Set,可以考虑用map来代替

5.性能优化atomic包

锁的实现是通过操作系统来实现,属于系统调用

atomic操作是通过硬件来实现,效率比锁高

sync.Mutex应该用来保护与一段逻辑,不仅仅用于保护一个变量

对于非数值操作,可以使用atomic.value,能承载一个interface{}\

6.性能分析工具-pprof

image-20230119221834828.png

image-20230119222110019.png 第一步,引用中加上

"net/http"
    _ "net/http/pprof"

第二步,在代码开始运行的地方加上

go func() {
   log.Println(http.ListenAndServe(":6060", nil))
}()

image-20230119222300963.png

  • allocs:查看过去所有内存分配的样本。

  • block:查看导致阻塞同步的堆栈跟踪。

  • cmdline: 当前程序的命令行的完整调用路径。

  • goroutine:查看当前所有运行的 goroutines 堆栈跟踪。

  • heap:查看活动对象的内存分配情况。

  • mutex:查看导致互斥锁的竞争持有者的堆栈跟踪。

  • profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件。

  • threadcreate:查看创建新 OS 线程的堆栈跟踪。

    网页,运行该命令让程序开始半分钟(默认值)的CPU采样

    $ go tool pprof 【-http=:8080】

    http://127.0.0.1:6060/debug/pprof/profile

    topN

image-20230119222525886.png list:根据正则表达式查找代码行

image-20230119222600088.png

web:调用关系可视化

Heap:堆内存查看

goroutine:协程

mutex:显示锁

block:显示阻塞情况

### 7.性能分析工具pprof采样原理

image-20230119223727802.png

二、课后个人总结:

本节课在程序性能优化方面进行了讲解,先讲解了代码级别的优化,程序性能的分析工具,以及最后的底层原理还有性能调优案例,使我对程序性能优化有了更加全面的认识。