高质量编程与性能优化|青训营笔记

18 阅读3分钟

高质量编程与性能优化|青训营笔记


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

一.高质量编程

1.代码格式用gofmt格式化,使用goimports管理包和依赖。

2.注释解释函数的功能、实现、适用条件以及报错原因等,不重复注释。

3.命名时缩略词全大写,为开头时若不需要导出全小写。命名时信息要丰富但不重复。

4.流程尽量直线避免嵌套,先判断特殊情况和错误,主要功能放在判断以外

5.尽量使用error而不是panic以免程序崩溃

二.性能优建议

1.性能测试工具--benchmark

2.slice、map在make的时候先预分配大小

data := make([]int , 0, size)  

data :=make(map[int]int ,size)

3.字符串多次拼接使用strings.Builder,bytes.Buffer也可,但不用+=

var builder :=strings.Builder
builder.WriteString(str)//增加
builder.String()//当前字符串

buf :=new(bytes.Buffer)
buf.WriteString(str)//增加
buf.String()//当前字符串

这两个底层都是用[]byte实现的,因此也可以预先分配好大小

builder.Grow(len(str))
buf.Grow(len(str))

4.使用空结构体,空结构体不占用大小。比如:当我们使用map只需要其键以实现set功能而不需要使用值时可以在值处放空结构体。

m :=make(map[int]struct{})

5.使用atomic包,锁是通过系统实现而atomic包是通过硬件实现的,效率更高。Mutex应该用来保护一段逻辑而不仅仅是一个变量

三.性能优化——pprof

性能优化应该抓瓶颈分析主要矛盾,要依靠分析数据而不是猜测,不要过早、过度优化

pprof的使用

首先在程序中加入import "net/http/pprof",自动注册pprof handlerhttp server,然后在主函数中启动服务监听接口:

go func(){
   if err:=http.ListenAndServer(":6060",nil);err!=nil{
      log.fatal(err)
   }
   os.Exit(0)
}()

这时候浏览器打开“localhost:6060/debug/pprof”,可以进入主界面。其中每一个选项都可以看详细数据但是比较难分析。

1.CPU分析

在命令行中输入go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10",这个命令会进行CPU分析,采集时间为10秒,也可以调整。

采集完之后可以输入toptopN查看占用最多的或其中N条。
其中,flat表示这个函数占用CPU大小,cum表示这个函数及其调用的函数一共占用的CPU大小。

使用list可以展示其中的代码细节,使用web可以跳转到可视化网页。

2.Heap堆内存及其他的分析

使用go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap",会自动跳转至浏览器可视化界面,其中8080为端口号,若8080不可用可换成其他端口,heap为查看项目,类似的可改成goroutine(协程),mutex(锁),block(阻塞)。

要先安装Graphviz可视化组件,下载地址, 安装完成后将bin目录及bin下的dot.exe放到path路径下即可使用。

其中View可切换查看方式,分别有表格、调用图、火焰图,源码等方式。SAMPLE可切换数据样本,其中alloc_XXX表示累积申请的XXX,inuse_XXX表示当前在使用的XXX。

火焰图越长表示占用CPU时间越长

附练习项目地址